Kopieren gleicher Eigenschaften zwischen Objekten unterschiedlicher Klassen

mcdroemmel

Mitglied
Hallo,

ich habe die Herausforderung, Daten zwischen Objekten verschiedener Klassen zu kopiereh. Dabei sollen nur die Daten kopiert werden, deren Properties gleichen Namen haben. Alle Objekte sind eigentlich dabei so aufgebaut, das die Properties alle private sind und über entsprechende getter-/setter-Methoden angesprochen werden.

Beispiel:
public class First
{
private int var1;
private String var2;
private float var3;
....
// hier folgen die öffentlichen Getter-/Setter-Methoden
}

public class Second
{
private int myvar;
private String var2;
private float VAR3;
....
// hier folgend wieder die öffentlichen Getter-/Setter-Methoden
}

Was ich nun benötigen würde wäre eine Klasse (hier ObjService genannt) mit einer statischen Klasse (hier copy genannt) die etwas in folgender Form realisiert:

First first = new First();
first.setVar1(0);
fest.setVar2('abc');
.... // weitere Setter aurufen
Second second = new Second();

ObjService.copy (first,second);

Dabei müssten Properties mit gleichem Namen (unabhängig von Groß-Kleinschreibung, also case-insensitive) kopiert werden.

Hat jemand eine Idee wie sowas zu realisieren ist? Über Code-inspection?
Toll wäre ein Beispiel oder vielleicht eine bereits bekannte offene Klasse.

Gruß und Dank im Vorraus
McD
 
Moin,

bitte benutze zukünftig die Code-Tags (der '#'-Button hier im Editor oder Einklammerung des Codes mit [*JAVA][*/JAVA] ohne die Sternchen) ... dadurch wird alles deutlich lesbarer - Danke ! :p

Zu Deinem Problem (soweit ich es verstehe) : die Klasse kannst Du Dir doch ganz leicht selbst schreiben ..... ^^

Auf die Schnelle (ungetestet) etwa so:
Java:
public class ObjService
{
    public void copyFirst2Second( First first, Second second )
    {
        second.setMyVar( first.getVar1() );
        second.setVar2( first.getVar2() );
        second.setVar3( first.getVar3() );
        // and so on .....
    } // copy
} // class ObjService
Das ginge natürlich auch äquivalent in die andere Richtung!

Und noch ein Tipp:
Gewöhn' Dir am Besten ganz schnell vernünftige Bezeichner für Klassen, Methoden, Variablen etc. an.
Eine Funktion "copy( A, B)" sagt doch Dir schon bald nichts mehr ... kopiert sie A nach B oder B nach A oder beide ganz woanders hin ...
Und ich garantiere Dir, dass Du spätestens in vier Wochen selbst nicht mehr genau weißt, was "var1, var2, var3" und "myvar, var2, VAR3" ist - zumal Du dabei ja auch noch lustig mit unterschiedlichsten Datentypen hantierst!

Gruß
Klaus
 
Zuletzt bearbeitet:
Über Reflection kannst du das umsetzen. Ich geb dir mal nen Ansatz wie du alle Felder eines Objektes bekommst:
Java:
for(Field field : object.getClass().getFields( )){
	System.out.println(field.getName( ));
}

Mit toLowerCase auf dem Namen kannst du die Felder dann in eine ArrayList speichern und schauen ob das zweite Objekt die auch hat (contains auf der ArrayList). Wenn du ein solches Feld gefunden hast, kannst du dir den entsprechenden Getter mit object.getClass().getMethod(..) holen.
 
Hallo zusammen,

erst einmal vielen Dank für Eure (ersten) Antworten.

@Klaus:
Die Namen sind nur Beispiele. Meine Variablen und Methoden heißen natürlich im Normalfall anders. Und das ich eine solche statische Klasse schreiben kann ist mir klar. Nur ich habe es mit vielen unterschiedlichen Klassen zu tun die von meinem Tool (SAP WebDynpro) generiert werden und zwischen denen ich dann Daten kopieren muss. Wer vielleicht WebDynpro kennt wird jetzt sagen, da gibts doch WDCopyService (Object a, Object b) aber da werden die Properties case-sensitive kopiert.

@zeja: Das ist schon eher was ich suche. Eine Allgmeine statisch Methode die zwei Objekte übergeben bekommt deren Typ sie so erst mal nicht kennt. Mit Reflection/( oder auch Introspection?) sollte das die Methoden dann eben das Objekt analysieren, die passenden Felder finden und dann die entsprechenden Getter/Setter aufrufen. Da ich aber bisher noch nie selbst was mit Reflection gemacht habe und nur theoretisch davon gehört habe sage ich schon mal Danke für den Ansatzpunkt.

Gruß
McD
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück