注解

  • 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
  • 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
  • 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

JAVA提供的基本注解

  • @Override

    • 限定重写父类方法。对于子类中被@Override 修饰的方法,如果存在对应的被重写的父类方法,则正确;如果不存在,则报错。@Override 只能作用于方法,不能作用于其他程序元素
  • @Deprecated

    • 用于表示某个程序元素(类、方法等)已过时。如果使用了被@Deprecated修饰的类或方法等,编译器会发出警告
  • @SuppressWarnings

    • 抑制编译器警告
  • @SafeVarargs

    • 是JDK 7 专门为抑制"堆污染"警告提供的

      堆污染:简单的说就是当一个泛型类型变量赋值给不是泛型类型变量,这种错误在编译期间能被编译器警告,但是可以忽略,直到运行时报错

  • @FunctionalIterface

    • @FunctionalInterface就是用来指定某个接口必须是函数式接口,否则就会编译出错

自定义注解

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

属性的返回值类型有下列取值:

  • 基本数据类型
  • String
  • 枚举
  • 注解
  • 以上类型的数组

元注解

用于注解的注解

  • @Target:描述注解能够作用的位置

    • ElementType取值:

      • TYPE:可以作用于类上
      • METHOD:可以作用于方法上
      • FIELD:可以作用于成员变量上
      • ...
  • @Retention:描述注解被保留的阶段

public enum RetentionPolicy {
    // 保留在源码级别上
    SOURCE,

    //保留在class文件中,jvm无法读取到
    CLASS,

    //会保留到class字节码文件中,并被JVM读取到
    RUNTIME
}
  • @Documented:描述注解是否被抽取到api文档中
  • @Inherited:描述注解是否被子类继承
    • 父类的注解将会传递到子类上
  • @Repeatable:描述是否能重复注解(JDK8之后新增的功能)
    • 实现细节:通过一个注解容器

注解的解析

  • RetentionPolicy.RUNTIME :注解在class文件中,被JVM加载,可用反射解析注解
  • RetentionPolicy.CLASS:注解在class文件中,但JVM没有加载,只能采用字节码工具进行特殊处理
  • RetentionPolicy.SOURCE :注解在java文件中,不在class文件中,也不会被JVM加载
    • 只有在源码级别进行注解处理
    • Java提供注解处理器来解析带注解的源码,产生新的文件

RUNTIME注解本质

  • 继承Annotation接口的一个接口
  • 实际使用中有一个代理对象实现了此接口
  • 代理对象使用AnnotationInvocationHandler处理方法调用
  • AnnotationInvocationHandler使用一个map存储属性

应用

  • Servlet3.0
  • Junit
  • Spring & Spring boot
  • Lombok

results matching " "

No results matching " "

results matching " "

No results matching " "