Java 8可重复注解需定义@Repeatable注解(如@Role)及其容器注解(如@Roles),并在运行时用getAnnotationsByType()获取全部实例。

Java 8 引入了可重复注解(Repeatable Annotations),允许你在同一个声明(如类、方法)上多次使用同一个注解类型,而无需包裹在容器注解中。要实现这一点,需满足两个关键条件:定义一个可重复的注解类型,并为其指定一个“容器注解”。
1. 定义自定义注解并标注 @Repeatable
首先,创建你的业务注解(比如 @Role),并在其上用 @Repeatable 指明它对应的容器注解类型(如 Roles.class):
@Repeatable(Roles.class)
public @interface Role {
String value() default "USER";
}
2. 定义对应的容器注解
容器注解必须满足:名称通常为复数形式;类型是对应注解类型的数组;必须用 @Retention 和 @Target 显式声明与被注解类型一致的元注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Roles {
Role[] value();
}
3. 在类或方法上直接多次使用该注解
现在你就可以在目标位置重复使用 @Role,编译器和 JVM 会自动将其收集到 @Roles 容器中:
立即学习“Java免费学习笔记(深入)”;
@Role("ADMIN")
@Role("EDITOR")
@Role("VIEWER")
public class ArticleService {
// ...
}
@Role("READ")
@Role("WRITE")
public void saveArticle() { ... }
4. 运行时读取多个注解实例
通过反射获取时,不能直接调用 getAnnotation(Role.class)(只会返回第一个),而应使用 getAnnotationsByType(Role.class):
-
clazz.getAnnotationsByType(Role.class)→ 返回所有@Role实例数组 -
method.getAnnotationsByType(Role.class)→ 同样适用于方法 - 注意:
getAnnotation(Roles.class)也可用,但需手动解包value()字段


















