【源码解读】Java注释之常用元注释
Target
表明注释类型适用的上下文。可以应用注释类型的声明上下文和类型上下文,在代码中由ElementType的枚举常量表示。
如果定义注解时不写@Target,则该注解可以被应用到所有ElementType位置。
ElementType[] value();
解读:返回多个ElementType
场景:可以同时指定多个ElementType,用{,}
ElementType
ElementType是一个枚举类,规定了一个注解可以被应用到 Java 程序的哪些特定位置。
在定义注解时,需要通过@Target元注解来指定这个注解能用到哪些ElementType上 —— 如果注解被用在非指定的位置,编译器会直接报错。
| ElementType 枚举值 | 可注解的位置 |
|---|---|
| TYPE | 类、接口、枚举、注解本身 |
| METHOD | 方法 |
| FIELD | 字段(成员变量) |
| PARAMETER | 方法参数 |
| CONSTRUCTOR | 构造方法 |
| LOCAL_VARIABLE | 局部变量 |
| ANNOTATION_TYPE | 注解类型(@interface) |
| PACKAGE | 包 |
补充:
- 可以同时指定多个ElementType,用
- 如果定义注解时不写@Target,则该注解可以被应用到所有ElementType位置
- 运行时通过反射可以获取注解的@Target信息,框架会检查注解的标注位置是否符合预期,进一步做逻辑处理
Retention
指定注解能保留到 Java 程序的哪个阶段,它的属性是RetentionPolicy枚举,有三个值;如果不写@Retention,默认是CLASS。
补充:
-
Java 程序的执行流程
- java源码
- 编译器(javac)编译
- .class字节码文件
- JVM加载执行
-
Java 程序的三个核心阶段
-
源码阶段(Source):只存在于.java源码文件中,编译后就不存在;用于编译器在编译时检查
-
编译阶段(Class):编译成.class字节码文件后仍然存在,但JVM加载类时不会把注解加载到内存;用于在编译时修改字节码(新增、修改类结构等)
-
运行阶段(Runtime):JVM加载类后,注解仍存在于内存中,可通过反射获取;用于创建Bean、注入依赖等
MetadataDefinition
对元数据(描述数据的数据)进行标准化、结构化的定义和管理。简单说,就是给描述信息(比如注解、配置、字段说明等)制定统一的规则,让程序能识别、解析、使用这些描述信息。
Inherited
表示注释类型是自动继承的。只作用于类继承。
@Inherited能让子类 “自动继承” 父类上的注解(仅限类级别的注解),当你查询子类的某个注解时,如果子类自己没有,就会自动往父类找,直到找到或到 Object 类为止。
Deprecated
表示该程序是程序员不愿意使用的,或编译器在非已弃用的代码中使用或覆盖已弃用的程序元素时发出警告。

浙公网安备 33010602011771号