我找到了 this JDK bug并想了解它发生的原因。
场景(取自 the bug report)非常简单:一个 class
声明一个 private
方法,一个 interface
声明一个 public
具有相同签名的方法。它编译没有错误。
但是,当我运行这段代码时,我得到了 IllegalAccessError
interface I {
public void m();
}
class A {
private void m() {
System.out.println("Inside Class A");
}
}
abstract class B extends A implements I {
}
class C extends B {
public void m() {
System.out.println("Inside Class C");
}
}
public class Test {
public static void main(String... args) {
B b = new C();
b.m();
}
}
请帮助我理解为什么会出现此错误,因为我的代码编译正常。
Exception in thread "main" java.lang.IllegalAccessError:
tried to access method A.m()V from class Test
at Test.main(Test.java:25)
最佳答案
它会编译,因为一切看起来都很好。
但是b.m()
翻译为搜索签名m()
, 在 B
, 显然首先在 A
和(打算)稍后在界面中。在 A
私有(private)m()
被发现并砰。
不一致的语言行为,理论上可以由编译器避免。
改写
在编译过程中,找到了公共(public)接口(interface)方法 - 很好。在运行时,(无修饰符)签名在方法私有(private)的 A 中找到,永远不会到达方法公开的接口(interface)中的签名。
[仅供引用] 使用 javap 反汇编
invokevirtual method .../.../B.m:()V
当然在 C
上对象。
关于java - 处理继承时出现 IllegalAccessError - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46444657/