【发布时间】:2019-02-08 08:12:47
【问题描述】:
Java 内部类将外部实例的引用存储在合成字段中:
class A {
class B {}
}
java.util.Arrays.toString(A.B.class.getDeclaredFields())
// [final A A$B.this$0]
我想知道为什么这个字段不是作为私有生成的。
没有反射就不能被程序员访问(在B之外,A.this指的是它)。
明显的猜测是你可以在A(B之外)写一些需要访问它的东西,但我想不出这样的情况。
【问题讨论】:
-
你应该看到this
-
我正要说“这样这个字段可以在创建时由外部类设置”,但这当然也适用于私有字段......
-
@Novy 你能解释一下为什么吗?我没有看到任何我不知道的东西。
-
@Alexey Romanov 在我看来,为什么是因为在 java 中默认字段、方法和类是包私有的,这意味着它们不能从包外部访问。生成 A$B.this$0 生成的类是 A$B 作为生成的字段,它尊重默认值。 A$B.this$0 是对外部 this(A.this) 的引用。因此,如果您在 A(在 B 之外),您已经可以访问 A.this。不知道是不是你要的东西
-
我相信我找到了答案。
标签: java