java元注解共五个:@target限定作用位置,@retention控制生命周期(source/class/runtime),@documented使注解出现在javadoc中,@inherited支持类级注解继承,@repeatable实现同一位置重复使用注解。

Java元注解是定义其他注解的注解,它们不直接参与业务逻辑,而是控制自定义注解的行为和生命周期。掌握这五个标准元注解(@Target、@Retention、@Documented、@Inherited、@Repeatable)是设计可维护、可复用注解的前提。
@Target:限定注解能标注的位置
它指定自定义注解可以应用在哪些程序元素上,比如类、方法、字段、参数等。若不声明,该注解默认只能用于类、接口、枚举类型声明(即 ElementType.TYPE)。
- 常用值包括:TYPE(类/接口/枚举)、METHOD、FIELD、PARAMETER、ANNOTATION_TYPE(用于定义其他注解)等
- 支持多选,用大括号包裹,例如:
@Target({ElementType.METHOD, ElementType.FIELD}) - 如果误将仅限方法的注解加到类上,编译器会报错,这是静态安全的重要保障
@Retention:决定注解保留到哪个阶段
它控制注解在源码、编译后字节码、还是运行时是否还存在。这个选择直接影响你能否通过反射读取注解。
- SOURCE:仅保留在源码中,编译后丢弃(如 @Override)
- CLASS:保留在 .class 文件中,但运行时不可见(默认值)
- RUNTIME:保留在 .class 中且可通过反射获取(自定义注解最常用)
- 必须显式声明为
@Retention(RetentionPolicy.RUNTIME),否则getAnnotation()拿不到
@Documented 与 @Inherited:影响文档生成与继承行为
@Documented 是一个标记型元注解,表示该注解应被 Javadoc 工具记录进 API 文档;@Inherited 则表示该注解具有“继承性”——当父类标注了它,子类在未显式标注的情况下也会被视为拥有该注解。
-
@Documented 对框架开发有意义,比如 Spring 的
@Component就带此元注解,方便用户查阅文档 -
@Inherited 仅对 类级注解(
ElementType.TYPE)有效,对方法或字段注解无效 - 注意:它不是 Java 的“语义继承”,只是反射 API 在子类上调用
getAnnotation()时自动向上查找的约定
@Repeatable:支持同一位置重复使用同一个注解
Java 8 引入,解决“一个地方不能多次使用同名注解”的限制。要启用它,需配合一个容器注解(container annotation)使用。
- 被
@Repeatable(Container.class)标记的注解 A,必须声明容器注解 Container,其 value 成员返回 A 类型数组 - 使用时可写多次:
@MyRole("admin") @MyRole("user") public class UserService { ... } - 反射获取时,优先调用
getAnnotationsByType(MyRole.class),而非getAnnotation(MyRole.class)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











