このように定義された親クラス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継承で動作するか、または機能するかどうかに興味があります。
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つ以上のインターフェースを実装する型は、実装するインターフェースから注釈を継承しません。
答えはすでに見つかりました。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);
}
解決できるSpring Coreを使用して