注解定义和用法
Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.
注解是一种元数据,它可能关联代码中不同元素和构造,不会间接影响它注解的元素,然而能够被编译器辨认,能够联合反射等应用。
一个简略的注解申明如下,@interface 关键字引入了新的注解类型。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TaskName {String value();
}
注解能够申明有默认值和没有默认值的属性
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TaskName {String value();
int taskId() default 0;}
如果注解申明了没有默认值的属性,那么在该注解被利用的所用中央都应该提供注解属性值。
@TaskName (name = "test")
如果注解只有一个属性,并且是 value 那么名字能够被省略,然而应用的时候必须指定 value 的值,例如:@TaskName (“test”)
public @interface TaskName {String value();
}
保留策略
每个注解都有一个被称为保留策略(Retention Policy)的特色,它是一组如何保留注解的策略组合的枚举(RetentionPolicy 类型)。
策略 | 形容 |
---|---|
CLASS | 注解被编译器记录在 class 文件中,然而在运行时不须要虚拟机保留(即运行时不存在) |
RUNTIME | 注解被编译器记录在 class 文件中并且在运行时被虚拟机保留,因而能够通过反射机制获取 |
SOURCE | 注解被编译器抛弃(即注解仅在源码中保留,class 文件中不存在) |
上面的代码,RetentionPolicy.RUNTIME 将会保障注解在编译过程和运行的应用程序中存在。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TaskName {String value();
}
元素类型
每个注解必须有它可能利用的元素类型,元素类型被定义成一组可能的元素类型的枚举(ElementType)。
元素类型 | 形容 |
---|---|
ANNOTATION_TYPE | 表明注解可用于注解类型申明(利用于另外的注解) |
CONSTRUCTOR | 表明注解可用于构造函数申明 |
FIELD | 表明注解可用于字段 / 域(包含枚举常量)申明 |
LOCAL_VARIABLE | 表明注解可用于局部变量申明 |
METHOD | 表明注解可用于办法申明 |
PACKAGE | 表明注解可用于包申明 |
PARAMETER | 表明注解可用于参数申明 |
TYPE | 表明注解可用于类、接口(包含注解类型)、枚举类型的申明 |
TYPE_PARAMETER | 表明注解能够写在类型变量的申明语句中 |
TYPE_USE | 示意该注解能写在应用类型的任何语句中(eg:申明语句、泛型和强制转换语句中的类型) |
注解能够应用 @Target 注解申明多个与之相关联的多个元素类型