java - 为什么内部类的 this$0 字段不是私有(private)的?

标签 java

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

class A {
    class B {}
}

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

我想知道为什么这个字段没有生成为私有(private)字段。

如果没有反射,程序员就无法访问它(在 B 之外,其中 A.this 引用它)。

明显的猜测是,您可以在 A 中(在 B 外部)编写一些需要访问它的内容,但我想不出任何这样的情况。

最佳答案

我的想法是错误的。需要访问 B.this$0 的不是 A,而是 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;
    }
}
C 中的

A.this 必须作为 this$1.this$0 进行访问。或者,它可以有两个字段

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

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

关于java - 为什么内部类的 this$0 字段不是私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588276/

相关文章:

java - 如何使用占位符在 Bootstrap 模型中显示的文本框中设置值

java - weblogic 12c 基本身份验证不提示输入用户标识

java - 从头开始创建哈希表?

java - 在 Chrome 浏览器中使用 selenium webdriver 截取屏幕截图

java - Android Studio中如何保存按钮的状态?

java - java.lang.ArrayIndexOutOfBoundsException:MapReduce

java - 在自定义应用程序类中保存对象存储是一种好习惯吗

使用 scanner.hasNext() 时出现 Java NullPointerException;

java - 为什么 Scala Source.fromURL 比 Apaches IOUtils 慢?

java - hibernate 恩弗斯 : Log user ip address