Outer$Inner该类的字节码将包含一个名为
this$0type
的包作用域
Outer。这就是用Java实现非静态内部类的方式,因为在字节码级别上没有内部类的概念。
如果您确实愿意,您应该能够使用反射来读取该字段。我从来不需要这样做,因此最好更改设计以使其不再需要。
这是使用反射时示例代码的外观。天哪,这很丑。;)
public class Outer { public static void foo(Inner inner) { try { Field this$0 = inner.getClass().getDeclaredField("this$0"); Outer outer = (Outer) this$0.get(inner); System.out.println("The outer class is: " + outer); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public class Inner { } public void callFoo() { // The constructor of Inner must be called in // non-static context, inside Outer. foo(new Inner()); } public static void main(String[] args) { new Outer().callFoo(); }}


