Java:从内部类访问受保护的字段
最近,当我尝试从内部类访问由其他类装入器装入的outer的父类中声明的受保护字段时,我遇到了运行时错误的问题。简要:java.lang.IllegalAccessError
- 类具有受保护字段 。
Parent
p
- 类扩展 。
Outer
Parent
- 类 是在 类 中定义的内部类。
Inner
Outer
- 在类内部有一个代码:.
Inner
Outer.this.p
- 所有类都在同一包中声明。
通常,它被编译并运行良好,直到和类由不同的类装入器装入。在这种情况下,当我们尝试从 访问时,我们会得到。我发现一个旧的错误报告(似乎是一个功能)描述了这种行为:Parent
Outer
java.lang.IllegalAccessError
Outer.this.p
Inner
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6258289
但解决方案听起来与我相矛盾:
关键是,在失败的情况下,内部类不在同一个包中(也不是)ConcreteCommand/AbstractCommand的子类。这完全违反了受保护类的 Java 规范。
这听起来是正确的。但是,如果我们在不同的包中声明和类,但使用单个类加载器加载(只需创建示例控制台应用程序而不加载任何jar),则不会收到任何错误。因此,从技术上讲,这违反了受保护类的Java规范,但由于我们使用内部类,因此它可以工作。Parent
Outer
因此,对于两种“不同包”的情况,我们有不同的行为。
- 在不同的包中声明,由单个类装入器装入 - OK。
- 在单个包中声明,由不同的类装入器装入 - 不行。
有人可以清楚地解释内部类如何访问父级的字段,以及为什么它在两种情况下的工作方式不同吗?