gpt4 book ai didi

java - 处理继承时出现 IllegalAccessError - 为什么?

转载 作者:太空狗 更新时间:2023-10-29 22:57:31 25 4
gpt4 key购买 nike

我找到了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com