Mam listę zawierającą dane z typu String ->["classField1", "classField2", "classField3"]
Dynamicznie utworzyć obiekt w Java z nazwy klasy i ustawienie pól klasy za pomocą listy z danymi
Mam metoda (myMethod(List list, String className)
), która przyjmuje jako parametr Lista. Tak, mogę przekazać tę listę za pośrednictwem parametru do myMethod (lista list, String className).
W myMethod
, chcę utworzyć jeden obiekt, który będzie instancją klasy, który jest drugim parametrem. Potem chcę ustawić pola klasy, używając danych z Listy. Z uwagi na fakt, że chcę uzyskać dynamicznie pola klasy, wynik powyższego jest taki, że muszę rzutować każdą wartość ciągu z listy na typ każdego pola klasy.
Jestem pewna, że kolejność napisów znajdujących się wewnątrz listy jest poprawna i odpowiada polom klasy o tej samej kolejności.
Czy ktoś ma pojęcie, jak wykonać powyższe czynności?
Przykład:
["StringtempValue", "StringUnitOfMeasurement"]
=>
Tworzenie instancji obiektu:
public class TempStruct {
private double tempValue;
private String unitOfMeasurement;
public TempStruct(double tempValue, String unitOfMeasurement) {
this.tempValue = tempValue;
this.unitOfMeasurement = unitOfMeasurement;
}
}
staram się dać rozwiązanie następujący sposób:
Właściwie Chcę stworzyć obiekt istniejącej klasy i próbowałem to zrobić z refleksją. Używam następującego kodu:
Class<?> cls = Class.forName(name);
Object clsInstance = (Object) cls.newInstance();
Field[] objectFields = clsInstance.getClass().getDeclaredFields();
Ale otrzymuję wyjątek od drugiej linii, gdy próbuje utworzyć nowy obiekt. Jako, że @JB Nijet powiedział, że nie wiedziałem, że metoda getDeclaredFields() nie zwraca pól posortowanych.
Właściwie, mam metodę, która akceptuje tylko listę ciągów, więc za pomocą refleksji konwertuję obiekt na listę ciągów, a następnie chcę zrobić odwrotnie. Nie myślałem, że w inny sposób to zrobić.
http://docs.oracle.com/javase/tutorial/reflect/index .html Z czym konkretnie masz problemy? –
Obie instrukcje getFields() i getDeclaredFields() mówią: "Elementy zwróconej tablicy nie są sortowane i nie są w żadnej określonej kolejności".Zastanawiam się, na jakim rodzaju pól polegasz. –
Nie jestem pewien, czy chcesz utworzyć i wypełnić obiekt istniejącej klasy (w takim przypadku, jak zasugerował @PeterLawrey, potrzebujesz refleksji), lub jeśli chcesz dynamicznie tworzyć i kompilować nową klasę i zwracać puste wystąpienie tej klasy. W przypadku drugiego wymagania należy zapoznać się z [javax.tools.JavaCompiler API] (http://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html) lub biblioteką manipulacji Bytecode, np. jako [ASM] (http://asm.ow2.org/) lub [BCEL] (http://commons.apache.org/bcel/). –