@repeatable 注解需与容器注解配对使用:业务注解须标注 @repeatable(容器.class)、runtime 保留策略和匹配的 target;容器注解必须是仅含 value() 方法的 interface,返回业务注解数组,且 retention 和 target 与业务注解完全一致;运行时须用 getannotationsbytype() 获取全部实例。

Java 中的 @Repeatable 不是让注解“自动变列表”,而是通过一套明确协作机制,把多个同类型注解在语法上写得像列表,在运行时也能统一取出来——关键在于业务注解和容器注解必须配对、一致、规范。
业务注解要显式声明可重复
它本身不是独立可用的,必须用 @Repeatable 指向一个已定义的容器注解类:
- 加上
@Repeatable(YourContainer.class),括号里必须是真实存在的、正确包路径的容器接口(不能写错名、漏.class) -
@Retention(RetentionPolicy.RUNTIME)必须有,否则反射读不到 -
@Target要明确指定适用位置(如METHOD、TYPE),后续容器注解也得完全匹配 - 属性建议都设默认值,避免使用时强制填空
容器注解必须严格合规
它不是命名习惯,而是编译器强校验对象,缺一不可:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 必须是
@interface,不能是 class 或普通 interface - 只能有一个方法:名为
value(),返回类型为业务注解数组(如Role[] value();) -
@Retention和@Target必须与业务注解逐字一致(包括所有 ElementType) - 不能加
@Repeatable,也不允许再嵌套其他容器
写法自然,但字节码只存容器
源码中你可以连续写多个相同注解,语义清晰:
@Role("ADMIN") @Role("EDITOR") public void update() { }- 编译后,字节码里实际只存一条
@Roles({@Role("ADMIN"), @Role("EDITOR")}) - 原始的
@Role并不“直接存在”,所以不能靠getAnnotation(Role.class)获取
运行时必须用对反射方法
能否拿到全部实例,取决于你调用哪个 API:
-
❌ 错误方式:
method.getAnnotation(Role.class)→ 总是返回null或未定义行为 -
✅ 正确方式:
method.getAnnotationsByType(Role.class)→ 自动展开容器,返回完整数组 -
⚠️ 可用但冗余:
method.getAnnotation(Roles.class).value()→ 多一层解包,且不自动合并父类上的同类注解
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










