Java 8允许在@Repeatable
注释的帮助下在同一元素上使用相同类型的多个注释。
不幸的是,他们显然忘记了对一个注释案例的相应功能支持:
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
public class MultipleAnnotationsCompatibility {
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface FileTypes {
FileType[] value();
}
@Inherited
@Repeatable(FileTypes.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileType {
String value();
}
@FileType("png")
@FileType("jpg")
public static class Image {
}
@FileType("xls")
public static class Worksheet {
}
public static void main(String[] args) {
FileTypes fileTypes;
fileTypes = Image.class.getAnnotation(FileTypes.class);
System.out.println("fileTypes for Image = " + Objects.toString(fileTypes));
fileTypes = Worksheet.class.getAnnotation(FileTypes.class);
System.out.println("fileTypes for Worksheet = " + Objects.toString(fileTypes));
}
}
第二个println
输出null
,尽管事实上,案例之间没有逻辑差异。
有没有办法用相同的代码处理1和2+注释的情况?
他们应该为boolean
制作@Repeatable
参数,以同样的方式处理单数注释?
答案 0 :(得分:5)
在这两种情况下都可以使用Class::getAnnotationsByType
:
此方法与
AnnotatedElement.getAnnotation(Class)
之间的区别在于此方法检测其参数是否为可重复的注释类型(JLS 9.6),如果是,则尝试通过“查看”查找该类型的一个或多个注释“容器注释。
修订示例:
FileType[] fileTypes;
fileTypes = Image.class.getAnnotationsByType(FileType.class);
System.out.println("fileTypes for Image = " + Arrays.toString(fileTypes));
fileTypes = Worksheet.class.getAnnotationsByType(FileType.class);
System.out.println("fileTypes for Worksheet = " + Arrays.toString(fileTypes));
输出:
fileTypes for Image = [@abc$FileType(value=png), @abc$FileType(value=jpg)]
fileTypes for Worksheet = [@abc$FileType(value=xls)]