注解和自定义注解

语法规范

  • 自定义注解使用@interface关键字
  • 自定义的注解默认自动继承了java.lang.annotation.Annotation接口,并且不能再去继承别的类或是接口
  • Annotation类型的成员变量在Annotation定义中以无参方法的形式来声明,其方法名和返回值定义了该成员变量的变量名和变量类型,称为配置参数
  • 定义成员变量时可以指定默认值,使用default关键字,若未指定,则使用时必须提供该变量值
  • 如果只有一个参数成员变量,建议参数名使用 value,
  • 如果定义的注解含有配置参数,那么使用时必须指定参数值,格式为 参数名 = 参数值,如果只有一个参数成员,且变量名为value,可省略"value="

元注解

用来给其他注解做注解的注解,JDK提供了4种元注解,分别是@Retention、@Target、@Document、@Inherited

@Retention

定义注解的生命周期 SOURCE < CLASS < RUNTIME ,所有前者能作用的地方后者一定也能作用。

  如果需要在运行时去动态获取注解信息,只能用 RUNTIME ;

  @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

  如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;

  @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,如@ThreadSafe,@NonNull

  如果只是做一些检查性的操作,则可选用 SOURCE 注解,比如@Override 和@SuppressWarnings,@Data

  @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含

@Target

定义注解的作用目标。也就是这个注解能加在类的哪些元素上

  

   @Target(ElementType.TYPE)                    //接口、类、枚举、注解

  @Target(ElementType.FIELD)                   //字段、枚举的常量

  @Target(ElementType.METHOD)                 //方法

  @Target(ElementType.PARAMETER)              //方法参数

  @Target(ElementType.CONSTRUCTOR)            //构造函数

  @Target(ElementType.LOCAL_VARIABLE)         //局部变量

  @Target(ElementType.ANNOTATION_TYPE)        //注解

  @Target(ElementType.PACKAGE)                //

   @Target(ElementType.TYPE_PARAMETER)         //java8新增

   @Target(ElementType.TYPE_USE)               //java8新增

 

@Document

说明该注解将被包含在javadoc中

@Inherited

说明子类可以继承父类中的该注解。如果一个注解@XX被元注解@Inherited修饰,然后使用@XX修饰了一个类A,那么类A的子类B也可以继承@XX注解

 

posted @ 2022-06-20 18:06  鼠标的博客  阅读(83)  评论(0编辑  收藏  举报