我有一个可重复的注释
@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
。怎么可能?
答案 0 :(得分:5)
您应该仔细阅读有关repeatable annotations的文档。这是因为多个可重复的注释被包装到容器注释中:
Reflection API中有几种可用于检索注释的方法。返回单个注释的方法(例如
AnnotatedElement.getAnnotationByType(Class<T>)
)的行为未更改,因为如果存在所请求类型的一个注释,它们仅返回单个注释。如果存在多个所请求类型的注释,则可以通过首先获取其容器注释来获取它们。
所以你有几个选择
getAnnotationsByType
方法Example[] annotations = Test.class.getAnnotationsByType(Example.class);
getAnnotation
Example[] annotations = Test.class.getAnnotation(Examples.class).value();