gpt4 book ai didi

java - 为什么 Java 编译器要为包私有(private)父类(super class)型中定义的公共(public)方法添加可见性桥接方法?

转载 作者:搜寻专家 更新时间:2023-11-01 03:38:02 25 4
gpt4 key购买 nike

我想知道为什么 Java 编译器会在这里为 foo 方法添加一个桥接方法:

public class Outer {

class SuperClass {
public void foo() { }
}

public class SubClass extends SuperClass { }
}

foo 方法被编译为SuperClass 类型中的public。尽管如此,SubClass 方法将该方法重新定义为通向同一方法的桥梁。我想知道为什么需要这座桥。

最佳答案

添加此桥接方法的原因是 Java 反射 API 中的一个极端情况,如果不添加桥接方法,它会导致 IllegalAccessException。该错误记录在 Oracle's bug tracker 中:

反射调用

Subclass.class.getMethod("foo").invoke(new Subclass())

没有从 SuperClass 的包中正确处理,因为 Java 运行时无法确定 foo 方法的调用是合法的。反射处理对方法声明类型的可见性检查,然后错误地得出该方法不可见且其调用非法的结论。

根据工单上的文档,没有更简单的解决方法。然而,即使在添加桥接方法之前,也会正常处理非反射调用。

关于java - 为什么 Java 编译器要为包私有(private)父类(super class)型中定义的公共(public)方法添加可见性桥接方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24106486/

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