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