首页 > 解决方案 > 为什么内部类的这个 $0 字段不是私有的?

问题描述

Java 内部类将外部实例的引用存储在合成字段中:

class A {
    class B {}
}

java.util.Arrays.toString(A.B.class.getDeclaredFields())
// [final A A$B.this$0]

我想知道为什么这个字段不是私有的。

程序员没有反射就无法访问它(外部B,哪里A.this引用它)。

显而易见的猜测是,您可以在A(outside B) 中写一些需要访问它的东西,但我想不出任何这种情况。

标签: java

解决方案


我想错了方向。不是A需要访问B.this$0,而是其自身潜在的内部类B

如果我们有

class A {
    class B {
        class C {}
    }
}

然后脱糖后C变成

class A$B$C {
    final A$B this$1;

    A$B$C(A$B b) {
        this$1 = b;
    }
}

并且A.this内部C必须以this$1.this$0. 或者,它可以有两个字段

    final A$B this$1;
    final A this$0;

在这种情况下,构造函数将包含this$0 = b.this$0;(这实际上是我在检查之前所期望的)。


推荐阅读