我想知道为什么Java编译器会在foo
这里为该方法添加一个桥接方法:
public class Outer {
class SuperClass {
public void foo() { }
}
public class SubClass extends SuperClass { }
}
该foo
方法被编译为public
类型SuperClass
。然而,该SubClass
方法将方法重新定义为通向相同方法的桥梁。我想知道为什么这座桥是必要的。
我想知道为什么Java编译器会在foo
这里为该方法添加一个桥接方法:
public class Outer {
class SuperClass {
public void foo() { }
}
public class SubClass extends SuperClass { }
}
该foo
方法被编译为public
类型SuperClass
。然而,该SubClass
方法将方法重新定义为通向相同方法的桥梁。我想知道为什么这座桥是必要的。
添加此桥接方法的原因是 Java 反射 API 中的一个极端情况,这将导致IllegalAccessException
未添加桥接方法。该错误记录在Oracle 的错误跟踪器中:
反思性调用
Subclass.class.getMethod("foo").invoke(new Subclass())
没有从其他包中正确处理,而不是SuperClass
没有桥方法修复,因为 Java 运行时无法确定该foo
方法的调用是合法的。反射处理对方法声明类型的可见性检查,然后错误地得出该方法不可见且其调用非法的结论。
根据票证上的文件,没有更简单的解决方法。但是,即使在添加桥接方法之前,也会正常处理非反射调用。