自定义注解能完成很多繁杂的工作,在此记录一下自定义注解创建过程,以及中间需要的知识

开始的开始

在创建自定义注解前,我们应该先了解java的元注解,即java内置的用于自定义注解的注解

  • @Retention
    用于表明注解保留到哪一层,即注解保留时间的长短
  1. SOURCE:只在源文件中有效
  2. CLASS:在class文件中有效(保留到编译文件时有效)
  3. RUNTIME:运行时有效(保留到运行时有效)

大多数自定义注解应该都保留到运行时有效,才能通过反射获取变量、方法,进行更多的操作
例子:

@Retention(RetentionPolicy.RUNTIME)
public @interface testAnn{
.......................
}
  • @Documented
    表明这个注解会写入javadoc文档中,没有成员变量,如果不添加该注解,注解是默认不会加入javadoc文档的
  • @Target
    规定注解应在哪里使用
  1. CONSTRUCTOR:用于构造方法
  2. FIELD:用于类的成员变量,包括枚举类的成员变量
  3. LOCAL_VARIBLE:用于局部变量
  4. METHOD:用于方法
  5. PACKAGE:用于包
  6. PARAMETER:用于形式参数(Formal Parameter)
  7. TYPE:用于类、接口(包括注解类)、枚举类
  8. TYPE_PARAMETER:用于类型参数,即泛型中的 < T > (1.8版本后开始使用,1.8无法使用)
  9. ANNOTATION_TYPE :用于自定义注解
  10. 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
    表明该注解如果作用于类时,等于该注解也作用于这个类的所有子类,要注意的是,只有注解作用于类的时候才生效,而方法、变量以及其他位置是无效的

元注解的学习是自定义注解的基础,因此要掌握好,才能进入自定义注解的学习
以上资料都是从互联网获取,如有错误,请及时指出