搜索 K
Appearance
Appearance
「元注解」是用来标注注解的注解,决定一个自定义注解能用在哪里、能保留到哪个阶段、能否被 IDE 文档化。JDK 1.5(2004)随注解一起引入,是反射读注解能跑通的基础。
| 元注解 | 作用 |
|---|---|
@Target | 注解能用在哪些位置(类、方法、字段、参数、注解本身等) |
@Retention | 注解保留到哪个阶段(源码 / 编译产物 / 运行时) |
@Documented | 是否进入 javadoc |
@Inherited | 子类是否继承父类身上的此注解(仅对 @Target(TYPE) 有效) |
三个 RetentionPolicy 的差异
SOURCE:编译期丢弃,典型如 @OverrideCLASS:进入字节码但运行时拿不到(默认值)RUNTIME:能被反射读到 —— 本框架所有注解都必须 RUNTIME@Target(ElementType.TYPE) // 只能标注在类型上
@Retention(RetentionPolicy.RUNTIME) // 运行时可反射
public @interface MyAnno {
String value() default "";
}在另一个类上反射读:
MyAnno anno = SomeClass.class.getAnnotation(MyAnno.class);
String v = anno != null ? anno.value() : "";如果 @Retention 不是 RUNTIME,上一行返回的就是 null。
打开 Model.java 可以看到所有外层与内嵌注解都同时打了:
@Target(ElementType.TYPE) // 或 ElementType.FIELD
@Retention(RetentionPolicy.RUNTIME)这两行加在一起,才让 DdlInitializer#parseModel 这一行能拿到真实的注解实例:
Model model = clazz.getAnnotation(Model.class);如果 Retention 改成 CLASS,整套扫描机制就立刻失效。
→ 跳回 《注解模型设计》 看完整注解树