Hallo hab da ne ziemlich eklige Frage.
Ich weiß nicht wie ich an die Umgebende Instanz eines Objektes komme des Klasse ich nicht kenne.
Auf dem Screenshot vom Debugger sieht man das :
www.imagecross.com/image-hosting-view-14.php?id=8264screen.jpg
Bei der Variable Object o ist es bekannt das es eine umgebende Instanz gibt (this$0) aber im Code kann ich das nicht schreiben so.
Die Frage ist also wie greif ich auf o.this$0 korrekt zu?
Wie gesagt Typ der Klasse ist beim Compiliren nicht bekannt.
Sinn und Zweck ist von beliebiger Objekte zur Laufzeit Kopien der Instanz (nicht des Objekts mit clone() oder so) zu erstellen.
Und der Ganze Beispiel Code noch mit Semi Lösung und Problem:
Ich weiß nicht wie ich an die Umgebende Instanz eines Objektes komme des Klasse ich nicht kenne.
Auf dem Screenshot vom Debugger sieht man das :
www.imagecross.com/image-hosting-view-14.php?id=8264screen.jpg
Bei der Variable Object o ist es bekannt das es eine umgebende Instanz gibt (this$0) aber im Code kann ich das nicht schreiben so.
Die Frage ist also wie greif ich auf o.this$0 korrekt zu?
Wie gesagt Typ der Klasse ist beim Compiliren nicht bekannt.
Sinn und Zweck ist von beliebiger Objekte zur Laufzeit Kopien der Instanz (nicht des Objekts mit clone() oder so) zu erstellen.
Und der Ganze Beispiel Code noch mit Semi Lösung und Problem:
Code:
class A {
public int value;
public B b = new B();
public class B {
public void print() {
System.out.println(value);
}
}
}
public class SpeedTest {
public static Object getMeANew(Object o) {
Class c = o.getClass(); // der typ des Objekts
Class decl = c.getDeclaringClass(); // schauen ob es eine umgebende klasse gibt
if (decl != null) {
Constructor cons = null;
try {
cons = c.getConstructor(decl); //Konstruktor suchen der umgebende klasse als Argument nimmt
} catch (Exception e) {
e.printStackTrace();
}
try {
return cons.newInstance(decl.newInstance()); // neues Objekt mit ebenfalls neuem (aber FALSCHEM) umgebendem Objekt
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
return c.newInstance(); //ganz normal neue Instanz
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
//Anwendung und Problem
public static void main(String[] args) {
A a = new A();
a.value = 100;
a.b.print(); // Gibt 100 aus wie zu erwarten
a.b = (A.B)getMeANew(a.b);
a.b.print(); // Gibt 0 aus, sollte aber 100 ausgeben :/
}
}