我有一个班级
@ReadOnlyViewable(category = "Cache", description = "View the contents of a cache")
public class ReflectingCacheJmx<K, V> extends CacheJmx<K, V> {
我在其上添加了注释
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ReadOnlyViewable {
String description();
String category();
}
然后我有一个子类:
public class ObservableReflectingCacheJmx<K, V> extends ReflectingCacheJmx<K, V> {
这是一个子类:
public class CounterpartyCacheJmx extends ObservableReflectingCacheJmx<CounterpartyKey, Counterparty> {
当我采用CounterpartyCacheJmx
的实例并致电getClass().getAnnotation(ReadOnlyViewable.class)
时,我得到null
的结果。
另一方面,如果我拨打getClass().getSuperclass().getSuperclass().getAnnotation(ReadOnlyViewable.class)
,我会收到注释。
我认为getAnnotation
也应该在超类上返回注释而getDeclaredAnnotation
没有。
我的理解错了吗?我是否需要自己手动运行超类链(或使用第三方库)才能找到这个注释?
Spring ApplicationContext::getBeansWithAnnotation
在结果Map
中返回这些bean,因此似乎对注释进行了某种深度解析。
答案 0 :(得分:2)
您的注释缺少@Inherited
元注释:
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ReadOnlyViewable {
String description();
String category();
}
来自java.lang.annotation.Inherited
上的JavaDoc:
表示自动继承注释类型。如果注释类型声明中存在Inherited元注释,并且用户在类声明上查询注释类型,并且类声明没有此类型的注释,则将自动查询类的超类注释类型。将重复此过程,直到找到此类型的注释,或者到达类层次结构(对象)的顶部。
看一下Class.getAnnotation()
的实现,你最终会遇到private AnnotationData createAnnotationData(int classRedefinedCount)
,它会遍历超类注释,只有在AnnotationType.getInstance(annotationClass).isInherited()
返回true时才添加注释。