Annotation——自定义注解
Java中提供了 Annotation 功能,该功能可用于类,构造方法,成员变量,方法。参数等的声明中。该功能不会影响程序的运行,但是会对编译器警告等辅助工具产生影响。
定义 Annotation 类型
在定义 Annotation 类型时,需要用到用来定义接口的 interface 关键字,但需要在 interface 关键字前面加一个 “ @ ” 符号,即定义 Annotation 类型的关键字为@interface 。
public @interface MyAnnotation {
}
这样就是定义了一个 Annotation 类型。上面定义的 Annotation 类型未包含任何成员,为 Annotation 类型添加成员。
public @interface MyAnnotation {
String name();
Class type();
}
在为 Annotation 类型定义成员时,也可以为成员设置默认值。
public @interface MyAnnotation {
String name() default "默认值";
Class type() default void.class;
}
访问 Annotation 信息
可以通过反射注解,来访问 Annotation 信息,想要反射注解还需要了解一下元注解。元注解就是为其他注解做注解,也就是注解的注解。元注解有四个,常用的有两个 @Target 和 @Retention 。
@Target
在定义 Annotation 时,可以通过 @Target 来设置 Annotation 适用的程序元素种类,如果为设置 @Target ,则表示适用于所有程序元素。枚举类 ElementType 中的枚举常量用来设置 @Target。
枚举类 ElementType 中的枚举常量
枚举常量 | 说明 |
---|---|
ANNOTATION_TYPE | 表示用于 Annotation 类型 |
TYPE | 表示用于类,接口和枚举,以及Annotation 类型 |
CONSTRUCTOR | 表示用于构造方法 |
FIELD | 表示用于成员变量和枚举变量 |
METHOD | 表示用于方法 |
PARAMETER | 表示用于参数 |
LOCAL_VARIABLE | 表示用于局部变量 |
PACKAGE | 表示用于包 |
@Retention
通过设置 Annotation 类型的 @Retention ,可设置 Annotation 的有效范围。枚举类 RetentionPolicy 中的枚举常量用来设置 @Retention ,如果未设置 @Retention ,Annotation 的有效范围为枚举常量 CLASS 表示的范围。
枚举类 RetentionPolicy 中的枚举常量
枚举常量 | 说明 |
---|---|
SOURCE | 表示不编译 Annotation 到类文件中,有效范围最小 |
CLASS | 表示编译 Annotation 到类文件中,但是在运行时不加载 Annotation 到JVM中 |
RUNTIME | 表示在运行时加载 Annotation 到JVM中,有效范围最大 |
之前反射的三个类 Constructors (构造方法类),Field (成员属性类),Methods (成员方法类)都提供的可以反射注解的方法。