2016-06-01 10 views
1

hat hier ist der Codekann CGLIB (Java) tiefe Kopie eine Bohne, die eine Liste Eigenschaft

public class Root { 
private Long id; 
private List<Child> list; 
//getter and setter 
} 
public class Child { 
private Long id; 
//getter and setter 
} 

public static void main(String args) { 
    Child child = new Child(); 
    child.setId(1L); 
    List<Child> list = new ArrayList<>(); 
    list.add(child); 
    Root root = new Root(); 
    Root copyRoot = new Root(); 
    root.setId(2L); 
    root.setList(list); 

    BeanCopier copier1 = BeanCopier.create(Root.class, Root.class, false); 
    copier1.copy(root, copyRoot, null); 
    //can beancopier in cglib deep copy this root to copyRoot? 
    //because i found when i used beancopier the two instances still point the same list instance 
} 

in cglib tiefe Kopie dieser Wurzel copyRoot beancopier können? weil ich gefunden, wenn ich Beancopier die beiden Instanzen immer noch die gleiche Listeninstanz

Antwort

0

Die Art, wie cglib kann das Kopieren mit Code-Generierung verbessern, ist eine Klasse erstellen, die die angegebene Klasse Unterklassen. cglib muss dies für jeden verschachtelten Typ tun, ohne wissen zu können, welche Instanz einer Unterklasse jedem Feld zugewiesen ist. Daher kann dies nicht funktionieren.

Generell würde ich Ihnen empfehlen, nicht für diese Aufgabe auf die Codegenerierung verlassen entweder; Dies bot nur in den Tagen, in denen die JVM noch jung war, einen Leistungsvorteil. Moderne VMs funktionieren genauso gut mit Reflektion, zum Beispiel Apache's Bean Utilities.

könnte jedoch keine gute Idee, in erster Linie sein, eine automatisierte tiefe Kopie erstellen, aber Sie könnten in appropriate utilities aussehen.