注解之自定义注解

时间:2022-02-13 16:34:57

这篇看不懂也没关系,等写完“反射系列”之后,在用反射+自定义注解写一个demo案例,再回头看这些文字,应该会感受不同。


1. @Documented – 表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分。


2. @Target – 表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。(定义注解的作用目标**作用范围字段、枚举的常量/方法 )


3. @Inherited – 表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。


4. @Retention – 表示注解类型保留时间的长短,它接收RetentionPolicy参数,可能的值有SOURCE, CLASS, 以及RUNTIME。
                 SOURCE:注解仅存在于源码中,在class字节码文件中不包含;
CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得;

RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到;



5.列子:(看文档)

//如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
if (field.isAnnotationPresent(Annotation.class)){ 
      //如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
      SqlFieldType sqlFieldType = field.getAnnotation(Annotation.class);
}