对于案例N = 1,以相容的方式使用相同类型的多个注释

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来处理单选注释?

ass*_*ias 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));
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)