web-dev-qa-db-ja.com

Javaメソッドのアノテーションはメソッドのオーバーライドと連携して動作しますか?

このように定義された親クラスParentと子クラスChildがあります:

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

_Child::foo_へのMethod参照を取得した場合、childFoo.getAnnotation(MyAnnotation.class)は_@MyAnnotation_をくれますか?それともnullでしょうか?

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

62
Travis Webb

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()Super.foo()をオーバーライドするという事実にもかかわらず、@Onewayメソッドではありません。

注釈型にメタ注釈@Inheritedがある場合、クラス上のその型の注釈により、注釈がサブクラスに継承されます。したがって、上記の例では、MyAnnotation型に@Inherited属性が含まれていた場合、SubにはMyAnnotation注釈が付けられます。

@Inheritedアノテーションは、タイプ以外のアノテーションに使用される場合、継承されません。 1つ以上のインターフェースを実装する型は、実装するインターフェースから注釈を継承しません。

72
trutheality

答えはすでに見つかりました。JDKにはメソッド注釈の継承に関する規定はありません。

ただし、注釈付きメソッドを探してスーパークラスチェーンを登るのも簡単に実装できます。

/**
 * Climbs the super-class chain to find the first method with the given signature which is
 * annotated with the given annotation.
 *
 * @return A method of the requested signature, applicable to all instances of the given
 *         class, and annotated with the required annotation
 * @throws NoSuchMethodException If no method was found that matches this description
 */
public Method getAnnotatedMethod(Class<? extends Annotation> annotation,
                                 Class c, String methodName, Class... parameterTypes)
        throws NoSuchMethodException {

    Method method = c.getMethod(methodName, parameterTypes);
    if (method.isAnnotationPresent(annotation)) {
        return method;
    }

    return getAnnotatedMethod(annotation, c.getSuperclass(), methodName, parameterTypes);
}
10
Saintali

解決できるSpring Coreを使用して

AnnotationUtils.Java

7
jrey