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

标签 java inheritance

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

相关文章:

java - SQL嵌套异常

java - 如何使用 Spring Boot 从 java 属性文件中读取数据

java - 从不相关的方法调用 super 方法

java - 设置 TextView 的背景不起作用

java - 我应该使用 SceneBuilder 还是在代码中实现布局?

ASP.NET 用户控件继承用户控件生成空引用

python - 静态方法和继承设计

c# - 将基类中最复杂的方法声明为虚方法

java - 非bean对象中的EJB CDI注入(inject)?

c++ - 派生类映射