本文主要是记录所学,以供后续参考。注解是Java 1.5引入的,Java自定义注解是通过运行时靠反射获取注解,注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提供更多功能,它不仅包含元数据,还能作用于运行期,注解解析器能够使用注解决定处理流程。
一、创建自定义注解
创建自定义注解与编写接口很相似,只是在接口关键字前面添加@符合。
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;
@Target(ElementType.METHOD) // 只对方法有效
@Retention(RetentionPolicy.RUNTIME) // 运行时有效public @interfacePersonInfo {String name() default "";String id() default "";
}
在PersonInfo注解中定义了两个name和id两个方法。注解方法不能有参数,但可以有默认值;返回的类型局限于原始类型、字符串、枚举、注解或以上类型构成的数值。
在注解中可以包含与其绑定的元注解,元注解为注解提供信息,有四种元注解类型,如下说明:
1. @Documented – 表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分。
2. @Target – 用于描述修饰对象的范围,范围取值于ElementType这个枚举类:TYPE(类、接口(包括注释类型)或枚举声明)、METHOD((方法声明)、 CONSTRUCTOR(构造方法声明)、 FIELD(字段声明)、ANNOTATION_TYPE(注释类型声明)、LOCAL_VARIABLE(局部变量声明)、PACKAGE(包声明)、PARAMETER(参数声明)。如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。
3. @Inherited – 表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。
4. @Retention – 表示注解类型保留时间的长短,范围取值于RetentionPolicy这个枚举类:
(1)CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
(2)RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取
(3)SOURCE 编译器要丢弃的注释
二、使用自定义注解
注解保持性策略应该是RUNTIME,否则它的信息在运行期无效,我们也不能从中获取任何数据。
------20191224闪