第14章 Annotation(注解)
Annotation是代码里特殊标记,这些标记可以再编译、类加载、运行时被读取,并执行响应的处理。Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据。
14.1 基本Annotation
4个基本Annotation:
- @Override
- @Deprecated
- @SuppressWarnings
- @SafeVarargs
14.1.1 限定重写父类方法:@Override
@Override: 注解的方法必须为父类的方法,只能作用于方法,不能作用于其他程序元素。
14.1.2 标识已过时:@Deprecated
@Deprecated: 用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将发出警告。
14.1.3 抑制编译器警告:@SuppressWarnings
@SuppressWarnings: 指示被修饰的元素取消显示指定的编译器警告。如:@SuppressWarnings(value=“unchecked”)
14.1.4 Java7的“堆污染”警告与@SafeVarargs
用来消除“堆污染”的警告(详情挖坑代填)
14.2 JDK的元Annotation
java.lang.annotation包下有4个Meta Annotation(元Annotation),这4个元Annotation都用于修饰其他的Annotation定义。
14.2.1 使用@Rentention
标明注解的保留范围,该注解有个value的值,该值有三个RententionPolicy类型的可选选项:
- RententionPolicy.CLASS: 编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation。这是默认值。
- RententionPolicy.RUNTIME: 编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取Annotation信息。
- RententionPolicy.SOURCE: Annotation只保留在源代码中,编译器直接丢掉这种Annotation。
如果需要通过反射获取注解信息,就需要使用value的值为RententionPolicy.RUNTIME的@Rentention。使用方法如:
// 定义下面的Teatable Annotation保留到运行时
@Rentention(value = RententionPolicy.RUNTIME)
public @interface Testable{}
若Annotation的成员变量名为value时,程序中可以直接在Annotation后的括号里指定该成员变量的值,无须使用name=value的形式。
14.2.2 使用@Rentention
@Target 也只能修饰一个Annotation定义,它用于指定被修饰Annotation能用于修饰哪些程序单元。@Target包含一个名为value的成员变量,该成员变量的值为如下几个:
- ElementType.ANNOTATION_TYPE: 指定该策略的Annotation只能为修饰
- ElementType.CONSTRUCTOR: 只能修饰构造器
- ElementType.FIELD: 指定该策略的Annotation只能修饰成员变量
- ElementType.LOCAL_VARIABLE: 只能修饰局部变量
- ElementType.METHOD: 只能修饰方法定义
- ElementType.PACKAGE: 只能修饰包定义
- ElementType.PARAMETER: 可以修饰参数
- ElementType.TYPE: 可以修饰类、接口(包括注解类型)或枚举定义。
使用方法如下:
@Target(ElementType.FIELD)
public @interface Testable{}
14.2.3 使用@Documented
略
14.2.3 使用@Inherited
如果@Testable被@Inherited修饰表示@Testable修饰的类的子类也被该注解修饰。
14.3 自定义Annotation
14.3.1 定义Annotation
定义注解采用@interface来定义。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface MyTest {
//注解中定义成员变量以方法的形式来定义
String name();
int age();
}
如上代码定义了一个运行时注解,注解作用元素为PARAMETER,有两个成员变量:name和age。
14.3.2 提取Annotation信息
利用反射获取程序元素的注解信息。