1. ホーム
  2. java

Javaメソッドアノテーションは、メソッドオーバーライドとどのように連動するのですか?

2023-11-03 08:18:20

質問

親クラスである Parent と子クラス Child は、このように定義されています。

class Parent {
    @MyAnnotation("hello")
    void foo() {
        // implementation irrelevant
    }
}
class Child extends Parent {
    @Override
    foo() {
        // implementation irrelevant
    }
}

を取得すると Method への参照を Child::foo となります。 childFoo.getAnnotation(MyAnnotation.class) 私に @MyAnnotation ? それとも null ?

私はより一般的に、アノテーションがJavaの継承でどのように、あるいはどのように機能するかに興味があります。

どのように解決するのですか?

以下からそのままコピー http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html#annotation-inheritance :

アノテーションの継承

アノテーションの有無に基づく結合点のマッチングに関係するため、アノテーションの継承に関する規則を理解することが重要です。

デフォルトでは、アノテーションは継承されません。次のようなプログラムがあるとします。

        @MyAnnotation
        class Super {
          @Oneway public void foo() {}
        }

        class Sub extends Super {
          public void foo() {}
        }

<ブロッククオート

次に Sub には MyAnnotation アノテーションを持たず、かつ Sub.foo()@Oneway メソッドをオーバーライドしているにもかかわらず Super.foo() というものです。

アノテーションタイプがメタアノテーションである場合、そのメタアノテーションは @Inherited を持つ場合、そのタイプのアノテーションをクラスに付けると、そのアノテーションがサブクラスに継承されることになります。したがって、上記の例では、もし MyAnnotation 型に @Inherited 属性がある場合 Sub を持つことになります。 MyAnnotation アノテーションを持つことになります。

@Inherited アノテーションは、型以外のものにアノテーションを付ける際に使用される場合は継承されません。一つ以上のインターフェースを実装している型は、それが実装しているインターフェースからアノテーションを継承することはありません。