注解定义和用法

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();
}

nizaikanwome
7 声望0 粉丝

引用和评论

0 条评论