簡體   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