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/