Dim*_*ims 2 java annotations java-8
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));
}
}
Run Code Online (Sandbox Code Playgroud)
尽管事实上第二个println输出,null但案件之间没有逻辑差异.
有没有办法用相同的代码处理1和2+注释的情况?
他们应该以同样的方式制作boolean参数@Repeatable来处理单选注释?
您可以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));
Run Code Online (Sandbox Code Playgroud)
输出:
fileTypes for Image = [@abc$FileType(value=png), @abc$FileType(value=jpg)]
fileTypes for Worksheet = [@abc$FileType(value=xls)]
Run Code Online (Sandbox Code Playgroud)