[英]Why does the Java compiler add visibility bridge methods for public methods defined in package-private super types?
我想知道为什么Java编译器会在这里为foo
方法添加一个桥接方法:
public class Outer {
class SuperClass {
public void foo() { }
}
public class SubClass extends SuperClass { }
}
foo
方法在SuperClass
类型中编译为public
。 然而, SubClass
方法重新定义了该方法作为同一方法的桥梁。 我想知道为什么这座桥是必要的。
添加此桥接方法的合理性是Java反射API中的一个例子,它会导致IllegalAccessException
而不添加桥接方法。 这个bug记录在Oracle的bug跟踪器中 :
反思性的调用
Subclass.class.getMethod("foo").invoke(new Subclass())
没有桥接方法修复,没有正确处理其他包而不是SuperClass
包,因为Java运行时无法弄清楚foo
方法的调用是否合法。 反射处理可见性检查方法的声明类型,然后错误地断定该方法不可见并且其调用非法。
根据机票上的文档,没有更简单的解决方法。 然而,即使在添加桥接方法之前,也会正常处理非反射调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.