In Java, ogni volta che viene creata un'istanza di classe interna, questa viene associata a un'istanza di una classe esterna. Per curiosità, è possibile associare la classe interna ad un'altra istanza di una classe esterna?È possibile modificare l'istanza di classe esterna di una classe interna in Java?
risposta
Sì, questo è possibile, anche se suona come una pessima idea per me. L'idea è di impostare il puntatore altrimenti final
sull'istanza esterna usando reflection (che non è garantito per avere successo).
import java.lang.reflect.*;
public class Me {
final String name;
Me(String name) {
this.name = name;
}
class InnerMe {
String whoAreYou() {
return name;
}
}
InnerMe innerSelf() {
return new InnerMe();
}
public static void main(String args[]) throws Exception {
final Me me = new Me("Just the old me!");
final InnerMe innerMe = me.innerSelf();
System.out.println(innerMe.whoAreYou()); // "Just the old me!"
Field outerThis = innerMe.getClass().getDeclaredFields()[0];
outerThis.setAccessible(true);
outerThis.set(innerMe, new Me("New and improved me!"));
System.out.println(innerMe.whoAreYou()); // "New and improved me!"
}
}
La parte cruciale è outerThis.setAccessible(true);
- un SecurityManager potrebbe applicare una politica che vieta questo da riuscire.
Si dovrebbe essere in grado di, utilizzando la riflessione.
Basta avere tutti i campi della classe interna (getClass().getDeclaredFields()
) e vedere quale campo detiene il genitore, poi modificarlo (usando field.set(innerInstance, newParent)
Prima che si dovrebbe rendere il campo accessibili -. setAccessible(true)
)
Poiché il campo sembra essere final
, si può dare un'occhiata a this article per vedere come aggirarlo.
Detto questo, non avresti bisogno di farlo affatto - sarebbe un brutto doppio brutto per nessun guadagno reale.
Se si sta parlando sul tempo di istanze, è possibile utilizzare la seguente sintassi:
public class Outer {
public class Inner {}
}
...
Outer o = new Outer();
Outer.Inner i = o.new Inner();
Tuttavia, non è possibile (senza setAccessible(true)
) per associare l'istanza esistente di classe interna con l'altra istanza di classe esterna , perché il campo che indica l'istanza allegando è final
:
javap Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner extends java.lang.Object{
final Outer this$0;
public Outer$Inner(Outer);
}
(+1) buon posto con il 'finale'. – Bozho
+1 per 'o.new Inner()' - Ho imparato una nuova sintassi oggi. –
- 1. Cosa c'è di sbagliato in una classe interna che non usa una classe esterna in Java?
- 2. Classe interna che accede alla classe esterna
- 3. È una classe interna
- 4. Chiamare la funzione di classe esterna dalla classe interna
- 5. static_assert definizione classe interna/esterna
- 6. come accedere a una variabile di classe di classe esterna da classe interna in rubino
- 7. Una classe interna distorta in Java
- 8. Ottieni l'oggetto classe esterna da un oggetto di classe interna
- 9. È possibile generare una classe interna di una classe da compilare con un processore di annotazioni?
- 10. Accesso alla variabile di classe esterna nella classe interna
- 11. Come ottenere l'oggetto classe esterna dall'oggetto classe interna
- 12. Classe statica interna in Java
- 13. Posso accedere a oggetti classe esterna nella classe interna
- 14. Comportamento membro diverso della classe interna se la classe interna estende la classe esterna?
- 15. Subclassing classe interna da esterno Classe contro altra classe interna
- 16. Java: chiamando il metodo di classe esterna nella classe interna anonima
- 17. Come inizializzare un'istanza della classe interna se la classe interna è dichiarata nel metodo della classe esterna?
- 18. Java - Costruttore della classe interna - consentito solo per la classe esterna
- 19. Classe interna di istanziazione
- 20. Classe interna ed ereditarietà Java
- 21. Java classe interna visibilità di puzzle
- 22. testare una classe interna
- 23. Java: Statico vs classe interna
- 24. variabili di accesso della classe esterna in Java
- 25. Classe interna classe Golang
- 26. classe Annotate con classe interna
- 27. Vuoto classe interna anonima in java
- 28. È una classe locale in un metodo di una classe un amico di questa classe?
- 29. È legale di specializzarsi parzialmente classe interna template variadic con args dal modello variadic di una classe esterna
- 30. Metodo principale in una classe interna statica.?
A parte il suo potenziale nei futuri contest offuscati di Java, qual è il punto? Sai che se vuoi una classe interiore che può essere dissociata dal suo genitore puoi semplicemente dichiararla statica, giusto? –
Trovo affascinante questo problema. Qualcuno sa dove nel JLS è specificato come viene chiamato il puntatore alla classe esterna? Attraverso la sperimentazione, trovo che sia "questo $ 0", aggiunto da tanti "$" se necessario (forse nessuno). Questo è effettivamente specificato? – polygenelubricants
OK Ho appena scoperto che una classe interna di secondo livello usa invece questo $ 1. Affascinante! – polygenelubricants