@Repeatable注解自Java 8起支持同一位置多次使用相同注解,需定义业务注解(标@Repeatable及Retention/Target)和同RetentionPolicy与Target的容器注解(value()返回业务注解数组);使用时可直接重复书写,运行时须用getAnnotationsByType获取全部实例。

Java 中的 @Repeatable 注解是从 Java 8 开始引入的,用于解决“同一位置不能多次使用相同注解类型”的限制。
怎么定义可重复注解
必须同时定义两个注解:业务注解(带 @Repeatable)和它的容器注解。两者缺一不可:
- 业务注解需标注
@Repeatable(容器类.class),且自身要有@Retention(RetentionPolicy.RUNTIME)和明确的@Target - 容器注解必须是
@interface类型,其唯一抽象方法必须叫value(),返回类型为该业务注解的数组(如Permission[] value();) - 容器注解的
@Retention和@Target必须与业务注解完全一致
怎么使用可重复注解
定义完成后,可在类、方法等目标位置直接多次写同一个注解,无需手动包裹:
- 例如:
@Permission("read") @Permission("write") public void doWork() { } - 编译器会自动把多个
@Permission合并为一个@Permissions({@Permission("read"), @Permission("write")})存入字节码
运行时如何获取所有重复实例
不能用传统的 getAnnotation(Permission.class),因为 JVM 只存储容器注解。正确方式是:
立即学习“Java免费学习笔记(深入)”;
- 调用
element.getAnnotationsByType(Permission.class)—— 直接返回所有@Permission实例数组 - 也可先获取容器:
Permissions container = element.getAnnotation(Permissions.class);,再调container.value()展开


















