java - 为什么内部类的这个 $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
) 中写一些需要访问它的东西,但我想不出任何这种情况。
解决方案
我想错了方向。不是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;
(这实际上是我在检查之前所期望的)。
推荐阅读
- reactjs - 在@react-keycloak/ssr lib 中传递作用域
- python-3.x - 如何通过 matplotlib 显示类似 imshow 类型的点?
- gulp - 有没有办法使用 Gulp 中另一个包的默认导出并在输出中保留任务名称?
- python - 将.txt文件转换为csv时如何分隔列
- ios - SwiftUI 中的按钮大小和颜色
- git - 删除 .git/HEAD 文件后如何恢复 git 存储库
- postgresql - 带有spring-data-jdbc和postgres的springboot:时间戳上的尾随垃圾
- python - 客户端通过 send_file 命令调用服务器的 FLASK 端点时无法查看图像
- express - Using Vercel for frontend and Heroku for api
- amazon-web-services - Is there an easy way to allow incoming traffic from the AWS Console (in web-browser) in network security settings?