重复注释
在 Java 8 之前,相同注释的两个实例无法应用于单个元素。标准的解决方法是使用容器注释,其中包含一些其他注释的数组:
// Author.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
String value();
}
// Authors.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {
Author[] value();
}
// Test.java
@Authors({
@Author("Mary"),
@Author("Sam")
})
public class Test {
public static void main(String[] args) {
Author[] authors = Test.class.getAnnotation(Authors.class).value();
for (Author author : authors) {
System.out.println(author.value());
// Output:
// Mary
// Sam
}
}
}
Version >= Java SE 8
Java 8 使用 @Repeatable
注释提供了一种更清晰,更透明的使用容器注释的方法。首先我们将它添加到 Author
类:
@Repeatable(Authors.class)
这告诉 Java 将多个 @Author
注释视为被 @Authors
容器包围。我们也可以使用 Class.getAnnotationsByType()
通过它自己的类来访问 @Author
数组,而不是通过它的容器:
@Author("Mary")
@Author("Sam")
public class Test {
public static void main(String[] args) {
Author[] authors = Test.class.getAnnotationsByType(Author.class);
for (Author author : authors) {
System.out.println(author.value());
// Output:
// Mary
// Sam
}
}
}