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

时间:2014-06-08 13:10:07

标签: java javac java-bridge-method

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

public class Outer {

  class SuperClass {
    public void foo() { }
  }

  public class SubClass extends SuperClass { }
}

foo方法在public类型中编译为SuperClass。然而,SubClass方法重新定义了该方法作为同一方法的桥梁。我想知道为什么这座桥是必要的。

1 个答案:

答案 0 :(得分:1)

添加此桥接方法的合理性是Java反射API中的一个例子,它会导致IllegalAccessException没有添加桥接方法。该错误记录在Oracle's bug tracker

反思性调用

Subclass.class.getMethod("foo").invoke(new Subclass())
如果没有桥接方法修复,则

没有正确地从其他包中正确处理

,因为Java运行时无法确定SuperClass方法的调用是否合法。反射处理可见性检查方法的声明类型,然后错误地断定该方法不可见且其调用非法。

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