Getting hold of the outer class object from the inner class object Getting hold of the outer class object from the inner class object java java

Getting hold of the outer class object from the inner class object


Within the inner class itself, you can use OuterClass.this. This expression, which allows to refer to any lexically enclosing instance, is described in the JLS as Qualified this.

I don't think there's a way to get the instance from outside the code of the inner class though. Of course, you can always introduce your own property:

public OuterClass getOuter() {    return OuterClass.this;}

EDIT: By experimentation, it looks like the field holding the reference to the outer class has package level access - at least with the JDK I'm using.

EDIT: The name used (this$0) is actually valid in Java, although the JLS discourages its use:

The $ character should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems.


OuterClass.this references the outer class.


You could (but you shouldn't) use reflection for the job:

import java.lang.reflect.Field;public class Outer {    public class Inner {    }    public static void main(String[] args) throws Exception {        // Create the inner instance        Inner inner = new Outer().new Inner();        // Get the implicit reference from the inner to the outer instance        // ... make it accessible, as it has default visibility        Field field = Inner.class.getDeclaredField("this$0");        field.setAccessible(true);        // Dereference and cast it        Outer outer = (Outer) field.get(inner);        System.out.println(outer);    }}

Of course, the name of the implicit reference is utterly unreliable, so as I said, you shouldn't :-)