@Repeatable 是 JDK 1.8 中新增的一种注解,它主要作用是允许同一个程序元素多次使用相同的注解。
通过使用 @Repeatable 注解,我们可以在一个程序元素上多次使用相同的注解。
在使用 @Repeatable 注解时,我们需要同时提供一个容器注解(container annotation)来封装可重复注解的多个实例。
@Repeatable(Roles.class)public @interface Role { String value();}// 容器注解public @interface Roles { Role[] value();}
在一个类上添加多个 @Role 注解
@Role("admin")@Role("supervisor")public class MyClass { // ...}
MyClass 类来说,它同时拥有了 "admin" 和 "supervisor" 两个角色信息
使用反射获取 MyClass 的所有注解信息,然后找到其中标记了 @Roles 注解的那个注解,从而获取包含了所有角色信息的 Role 数组
Classclazz = MyClass.class;Roles roles = clazz.getAnnotation(Roles.class);if (roles != null) { for (Role role : roles.value()) { System.out.println(role.value()); // 输出 "admin", "supervisor" }}
@Role("admin")
@Role("supervisor")这2个注解被封装到了 @Roles 注解的 Role[] value(); 中
当有2个及以上相同注解时会被封装到容器注解,只有一个不会被封装