5

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

public class Outer {

  class SuperClass {
    public void foo() { }
  }

  public class SubClass extends SuperClass { }
}

foo方法被编译为public类型SuperClass。然而,该SubClass方法将方法重新定义为通向相同方法的桥梁。我想知道为什么这座桥是必要的。

4

1 回答 1

3

添加此桥接方法的原因是 Java 反射 API 中的一个极端情况,这将导致IllegalAccessException未添加桥接方法。该错误记录在Oracle 的错误跟踪器中:

反思性调用

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

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

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

于 2014-06-08T13:17:32.917 回答