Ich habe Probleme, die Reflektion in einem Klassenkonstruktor mit Vererbung zu arbeiten. Speziell möchte ich alle Attributwerte erhalten. HierReflektion im Konstruktor mit Vererbung (Java)
ist eine Demo für die naive Implementierung, die nicht funktioniert:
import java.lang.reflect.Field;
public class SubInitProblem {
public static void main(String[] args) throws IllegalAccessException {
Child p = new Child();
}
}
class Parent {
public int parentVar = 888888;
public Parent() throws IllegalAccessException {
this.showFields();
}
public void showFields() throws IllegalAccessException {
for (Field f : this.getClass().getFields()) {
System.out.println(f + ": " + f.get(this));
}
}
}
class Child extends Parent {
public int childVar = 999999;
public Child() throws IllegalAccessException {
super();
}
}
Dies wird zeigen, dass childVar
Null:
public int Child.childVar: 0
public int Parent.parentVar: 888888
Weil es noch nicht initialisiert ist.
Also ich denke, ich brauche nicht den Konstruktor direkt verwenden, sondern lassen den Konstruktor vollständig und dann Verwendung showFields
:
import java.lang.reflect.Field;
public class SubInitSolution {
public static void main(String[] args) throws IllegalAccessException {
SolChild p = SolChild.make();
}
}
class SolParent {
public int parentVar = 888888;
protected SolParent() {
}
public static <T extends SolParent> T make() throws IllegalAccessException {
SolParent inst = new SolParent();
inst.showFields();
return (T) inst;
}
public void showFields() throws IllegalAccessException {
for (Field f : this.getClass().getFields()) {
System.out.println(f + ": " + f.get(this));
}
}
}
class SolChild extends SolParent {
public int childVar = 999999;
public SolChild() throws IllegalAccessException {
}
}
Aber das funktioniert nicht, weil make
nicht zurückgibt der richtige Typ für Unterklassen. (Das Problem ist also new SolParent();
).
Was ist der beste Weg, dies zu lösen? Ich brauche alle Unterklassen zur Ausführung showFields
, aber ich kann nicht darauf verlassen, dass sie es explizit tun.
In Ihrem zweiten Beispiel, warum eine 'make' Methode implementieren? Warum nicht einfach 'new SolChild(). ShowFields();' – ToYonos
Rufen Sie solche Methoden nicht von einem Konstruktor. Sie tragen nicht zur Initialisierung bei und gehören daher nicht in Konstruktoren. –
@ToYonos Weil dann Leute, die meine Klasse benutzen, vielleicht vergessen, das zu tun – Mark