5

なぜ Java コンパイラがfooここにメソッドのブリッジ メソッドを追加するのか疑問に思っています。

public class Outer {

  class SuperClass {
    public void foo() { }
  }

  public class SubClass extends SuperClass { }
}

メソッドは、型になるようにfooコンパイルされます。それにもかかわらず、メソッドは、メソッドをまったく同じメソッドへのブリッジとして再定義します。なぜこの橋が必要なのだろう。publicSuperClassSubClass

4

1 に答える 1

3

このブリッジ メソッドを追加する理由は、Java リフレクション API のまれなケースでありIllegalAccessException、ブリッジ メソッドが追加されていない場合に発生します。このバグは、Oracle のバグ トラッカーに記載されています。

反射的な呼び出し

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

メソッドの呼び出しが正当SuperClassであることを Java ランタイムが判断できなかったため、ブリッジ メソッドを修正していないパッケージ以外のパッケージからは正しく処理されませんでした。fooリフレクションは、メソッドの宣言型の可視性チェックを処理します。これにより、メソッドが可視ではなく、その呼び出しが不正であると誤って結論付けられます。

チケットのドキュメントによると、簡単な回避策はありませんでした。ただし、非リフレクション呼び出しは、ブリッジ メソッドが追加される前であっても、正常に処理されました。

于 2014-06-08T13:17:32.917 に答える