没有看到继承的注释

时间:2018-01-19 12:20:04

标签: java annotations

我有一个班级

@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,因此似乎对注释进行了某种深度解析。

1 个答案:

答案 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时才添加注释。