繁体   English   中英

为什么Java编译器为package-private超类型中定义的公共方法添加可见性桥接方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM