自定义注解能完成很多繁杂的工作,在此记录一下自定义注解创建过程,以及中间需要的知识
开始的开始
在创建自定义注解前,我们应该先了解java的元注解,即java内置的用于自定义注解的注解
- @Retention
用于表明注解保留到哪一层,即注解保留时间的长短
- SOURCE:只在源文件中有效
- CLASS:在class文件中有效(保留到编译文件时有效)
- RUNTIME:运行时有效(保留到运行时有效)
大多数自定义注解应该都保留到运行时有效,才能通过反射获取变量、方法,进行更多的操作
例子:
@Retention(RetentionPolicy.RUNTIME)
public @interface testAnn{
.......................
}
- @Documented
表明这个注解会写入javadoc文档中,没有成员变量,如果不添加该注解,注解是默认不会加入javadoc文档的 - @Target
规定注解应在哪里使用
- CONSTRUCTOR:用于构造方法
- FIELD:用于类的成员变量,包括枚举类的成员变量
- LOCAL_VARIBLE:用于局部变量
- METHOD:用于方法
- PACKAGE:用于包
- PARAMETER:用于形式参数(Formal Parameter)
- TYPE:用于类、接口(包括注解类)、枚举类
- TYPE_PARAMETER:用于类型参数,即泛型中的 < T > (1.8版本后开始使用,1.8无法使用)
- ANNOTATION_TYPE :用于自定义注解
- TYPE_USE:能用于任何类型,class、基本数据类型、类型参数、错误类型。。。。(1.8版本后开始使用,1.8无法使用)
PACKAGE是比较特别的一个,源码说明是 Package declaration 意思是用于包的声明,但是他并不能直接作用在包的声明中,而需要写在pack-info.java中
特别说明一下, @Target 的value 可以是数组,说明注解能自定义地作用在不同范围
如果注解没有 @Target 注解,该注解的范围除了TYPE_PARAMETER
例子:
//表示该注解能作用与方法以及类的成员变量上
@Target({valueElemenType.Method,ElementType.FIELD})
public @interface testAnn{
.......................
}
- @Inherited
表明该注解如果作用于类时,等于该注解也作用于这个类的所有子类,要注意的是,只有注解作用于类的时候才生效,而方法、变量以及其他位置是无效的
元注解的学习是自定义注解的基础,因此要掌握好,才能进入自定义注解的学习
以上资料都是从互联网获取,如有错误,请及时指出