Java 注解 【Annotation】
1. Java 注解定义
注解(Annontation),Java5 引入的新特性,位于 java.lang.annotation 包中。
提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
是一种说明、配置、描述性的信息,与具体业务无关,也不会影响正常的业务逻辑。但我们可以用反射机制来进行校验、赋值等操作。
2. Java 注解应用
- 帮助程序员生成文档注释
- 在代码编译阶段进行格式检查,如 @Override 放在方法前,如果方法声明发生改变便会发生编译错误。
【方法声明包括】方法名,返回值,参数列表 - 可以实现替代配置文件的功能
- 可以利用反射解析和使用注解
3. Java 注解分类
1. 标准注解
如:@Override, @SuppressWarnings, @Deprecated等, 这些注解会是编译器开启严格格式检查
2. 元注解
元注解是在定义注解时使用的,元注解用来修饰注解
如:@Retention, @Target, @Documented, @Inherited
3. 自定义注解
程序员根据自己的需求个人定义的注解
4. 元注解
4.1 @Retention 【重点】
@Retention 用于明确该自定义注解用于那个阶段或者级别分为三种情况:
只存在于源代码中(SOURCE), 存在于类文件中(CLASS),进入运行状态(RUNTIME)
@Retention 的参数是一个枚举类型的 RententionPolicy
RententionPolicy.SOURCE
编译时被丢弃,不包含在 .class 类文件中
RententionPolicy.CLASS
JVM 虚拟机加载时被丢弃,包含在类文件中,默认值
RententionPolicy.RUNTIME
JVM 进行加载,包含在类文件中,也存在于运行状态
【重点】在这个阶段想要使用注解中的数据,需要通过反射获取
RetentionPolicy 源码
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
// 翻译:注释将被编译器丢弃。
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
// 翻译:注解由编译器记录在类文件中,但在运行时不需要由虚拟机保留。这是默认行为。
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
// 翻译:注解由编译器记录在类文件中,并在运行时由虚拟机保留,因此可以通过反射读取它们。
RUNTIME
}
4.2 @Documented
此注解主要用于生成文档信息,对类作辅助说明
4.3 @Target 【重点】
@Target 主要用于描述注解的使用范围(是类,方法,还是成员变量上,等等诸如此类)
ElementType 作为 @Target 的参数,是一个枚举类型,他就是来给定注解的使用范围的。
参数 | 范围 |
---|---|
ElementType.TYPE | 表示该注解可以用于类,接口,枚举 |
ElementType.FIELD | 表示该注解可以用于成员变量 |
ElementType.CONSTRUCTOR | 表示该注解可以用于构造方法 |
ElementType.METHOD | 表示该注解可以用于成员方法 |
ElementType.PARAMETER | 表示该注解可以用于成员方法参数 |