Skip to content

Java 元注解

是什么

「元注解」是用来标注注解的注解,决定一个自定义注解能用在哪里、能保留到哪个阶段、能否被 IDE 文档化。JDK 1.5(2004)随注解一起引入,是反射读注解能跑通的基础。

元注解作用
@Target注解能用在哪些位置(类、方法、字段、参数、注解本身等)
@Retention注解保留到哪个阶段(源码 / 编译产物 / 运行时)
@Documented是否进入 javadoc
@Inherited子类是否继承父类身上的此注解(仅对 @Target(TYPE) 有效)

三个 RetentionPolicy 的差异

  • SOURCE:编译期丢弃,典型如 @Override
  • CLASS:进入字节码但运行时拿不到(默认值)
  • RUNTIME:能被反射读到 —— 本框架所有注解都必须 RUNTIME

怎么用

java
@Target(ElementType.TYPE)            // 只能标注在类型上
@Retention(RetentionPolicy.RUNTIME)  // 运行时可反射
public @interface MyAnno {
    String value() default "";
}

在另一个类上反射读:

java
MyAnno anno = SomeClass.class.getAnnotation(MyAnno.class);
String v = anno != null ? anno.value() : "";

如果 @Retention 不是 RUNTIME,上一行返回的就是 null

本框架怎么用

打开 Model.java 可以看到所有外层与内嵌注解都同时打了:

java
@Target(ElementType.TYPE)        // 或 ElementType.FIELD
@Retention(RetentionPolicy.RUNTIME)

这两行加在一起,才让 DdlInitializer#parseModel 这一行能拿到真实的注解实例:

java
Model model = clazz.getAnnotation(Model.class);

如果 Retention 改成 CLASS,整套扫描机制就立刻失效。

→ 跳回 《注解模型设计》 看完整注解树