注解

1、定义

从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。

2、JDK中预定义的一些注解

  • @Override:检测被该注解标注的方法是否是继承自父类(接口)的
  • @Deprecated:该注解标注的内容,表示已过时
  • @SuppressWarnings:压制警告
    • 一般传递参数all @SuppressWarnings("all")

3、自定义注解

3.1 格式

元注解
public @interface 注解名称{
    属性列表;
}

3.2 本质

注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation{}

3.3 属性:接口中的抽象方法

  • 要求
    • 属性的返回值类型
      • 基本数据类型
      • String
      • 枚举
      • 注解
      • 以上类型的数组
    • 定义了属性,在使用时需要给属性赋值
    • 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    • 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
    • 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略。
public @interface MyAnno {
    int value();
}
@MyAnno(12)
public class Work {
}

3.4 元注解

用于描述注解的注解。

  • @Target:描述注解能够作用的位置
  • @Retention:描述注解被保留的阶段
  • @Documented:描述注解是否被抽取到api文档中
  • @Inherited:描述注解是否被子类继承

3.4.1 @Target

public @interface Target {
    ElementType[] value();
}
ElementType.java
public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

3.4.2 @Retention

public @interface Retention {
    RetentionPolicy value();
}
RetentionPolicy.java
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

自定义注解一般用RetentionPolicy.RUNTIME

posted @ 2021-08-08 20:48  浅笑岁月  阅读(51)  评论(0)    收藏  举报