Eu tenho o seguinte código. Eu quero me apossar do objeto de classe externa usando o qual eu criei o objeto de classe interna inner
. Como eu posso fazer isso?
public class OuterClass {
public class InnerClass {
private String name = "Peakit";
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
// How to get the same outer object which created the inner object back?
OuterClass anotherOuter = ?? ;
if(anotherOuter == outer) {
System.out.println("Was able to reach out to the outer object via inner !!");
} else {
System.out.println("No luck :-( ");
}
}
}
EDIT: Bem, alguns de vocês sugeriram modificar a classe interna adicionando um método:
public OuterClass outer() {
return OuterClass.this;
}
Mas e se eu não tiver controle para modificar a classe interna, (apenas para confirmar), temos outra maneira de obter o objeto de classe externa correspondente do objeto de classe interna?
fonte
OuterClass.this
referencia a classe externa.fonte
Você pode (mas não deve) usar a reflexão para o trabalho:
Obviamente, o nome da referência implícita não é totalmente confiável; portanto, como eu disse, você não deve :-)
fonte
A resposta mais geral a essa pergunta envolve variáveis sombreadas e como elas são acessadas.
No exemplo a seguir (do Oracle), a variável x em main () está sombreando Test.x :
A execução deste programa imprimirá:
Mais em: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
fonte
Aqui está o exemplo:
fonte
se você não tem controle para modificar a classe interna, a reflexão pode ajudá-lo (mas não é recomendável). este $ 0 é uma referência na classe Inner, que informa qual instância da classe Outer foi usada para criar a instância atual da classe Inner.
fonte
Obviamente, o nome da referência implícita não é confiável, portanto você não deve usar reflexão para o trabalho.
fonte
Foram editados em 15/06 2020
fonte