对于多个注释,getAnnotation返回null

时间:2016-09-13 23:50:03

标签: java

我有一个可重复的注释

@Repeatable(Examples.class)
public @interface Example {
    int value();
}

使用容器注释

@Retention(RetentionPolicy.RUNTIME)
public @interface Examples {
    Example[] value();
}

然后我尝试启动此代码

@Example(1)
@Example(2)
public class Test {
    public static void main(String[] args) {
        Example example = Test.class.getAnnotation(Example.class);
        System.err.println(example);
    }
}

然而它会打印null。怎么可能?

1 个答案:

答案 0 :(得分:5)

您应该仔细阅读有关repeatable annotations的文档。这是因为多个可重复的注释被包装到容器注释中:

  

Reflection API中有几种可用于检索注释的方法。返回单个注释的方法(例如AnnotatedElement.getAnnotationByType(Class<T>))的行为未更改,因为如果存在所请求类型的一个注释,它们仅返回单个注释。如果存在多个所请求类型的注释,则可以通过首先获取其容器注释来获取它们。

所以你有几个选择

  1. 使用getAnnotationsByType方法
  2. Example[] annotations = Test.class.getAnnotationsByType(Example.class);
    
    1. 使用容器注释使用getAnnotation
    2. Example[] annotations = Test.class.getAnnotation(Examples.class).value();