2016-12-04 2 views
2

Ich versuche, alle Eigenschaften von einer Bohne in eine andere zu kopieren:Effiziente Möglichkeit, alle Bean-Eigenschaften in eine andere Bohne zu kopieren

public void copy(MyBean bean){ 
    setPropertyA(bean.getPropertyA()); 
    setPropertyB(bean.getPropertyB()); 
    [..] 
} 

Dies ist fehleranfällig und viel zu schreiben, wenn Sie eine Bohne mit vielen haben Eigenschaften.

Ich dachte an Reflexion, um dies zu tun, aber ich kann den Getter von einem Objekt nicht mit dem Setter des anderen "verbinden".

public List<Method> getAllGetters(Object object){ 
    List<Method> result = new ArrayList<>(); 
    for (final PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(object.getClass()).getPropertyDescriptors()) { 
    result.add(readMethod = propertyDescriptor.getReadMethod()); 
    } 
    return result; 
} 

bearbeiten:

BeanUtils.copyProperties(this, anotherBean); 

Arbeiten wie erwartet!

+0

Und Reflexion ist fehlerfrei? – GurV

+1

@ GurwinderSingh, danke für diesen wertvollen Kommentar. – kerner1000

+0

Ich habe [Orika] (http://orika-mapper.github.io/orika-docs/intro.html) und [Dozer] (https://github.com/DozerMapper/dozer) in einigen Projekten verwendet. Allerdings würde ich mit den manuellen Mappern gehen. Es ist nicht so schwierig und es ist nicht so fehleranfällig. Diese Tools (Orika und Dozer) erfordern entweder eine Konfiguration oder machen Ihren Code von beliebigen Konventionen abhängig. Obwohl sie hilfreich sind, ist der Preis dafür sehr hoch. –

Antwort

-1

Wenn Sie dies manuell tun möchten, empfehle ich zu verwenden, was "Serialisierungskopie" aufruft. Die einzige Einschränkung ist, dass die Bean die serialisierbare Schnittstelle am meisten implementiert. Wie du sagst, könnte es mit Reflektion gemacht werden, aber du könntest mehr Unannehmlichkeiten haben. Hoffe diese Hilfe.

+0

Das trifft hier nicht wirklich zu. Serialisierungskopie ist eine Strategie zum Klonen/Tiefkopieren. Es ist nicht anwendbar, ein Objekt zu übernehmen und es in ein anderes Objekt einer anderen Klasse zu kopieren. BeanUtils, oder rollen Sie Ihre eigenen mit Reflexion, ist die geeignete Option. Die einzige Möglichkeit zur Serialisierungskopie könnte hier nützlich sein, wenn eine neue Bean mit den gemeinsamen Elementen definiert wurde, ein Mitglied der beiden Beans erstellt wurde und Getter und Setter dazu delegiert waren, um die aktuelle einfache Bean-Schnittstelle zu verwalten. Dann könnte das kopiert werden. Aber das ist komplexer als nötig. –

Verwandte Themen