注解定义和用法
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注解声明多个与之相关联的多个元素类型
用法举例
Reflections reflections = new Reflections("com.package.test");
for (Class<?> clazz : reflections.getTypesAnnotatedWith(TaskName.class)) {
TaskName taskname = clazz.getAnnotation(TaskName.class);
String keyString = taskname.value();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。