JAVA SE注解(Annotation)那些事

注解的概念

  • 从JDK5.0开始,java增加了对元数据(MetaData)的支持,也就是Annotation(注解)
  • Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
  • Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的“name = value”对中。
  • 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

注解的通俗理解:

  • 注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造、局部变量等数据信息。
  • 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。

基本的Annotation介绍

  • 使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素。
  • 三个基本的Annotation:
    1. @Override:限定某个方法,是重写父类方法,该注解只能用于方法
    2. @Deprecated:用于表示某个程序元素(类、方法等)已过时
    3. @SuppressWarnings:抑制编译期警告
  • @interface不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface这么个东西表示了这个注解类,就是定义一个可用的注解类,包括这个注解用于什么地方,是类,还是方法,还是property,还是方法入参等等,还有这个注解是否编译后进入class,比如我们知道的用于javadoc的注解,是不进入class文件的。
  • @Override使用说明:
    1. @Override表示指定重写父类的方法(从编译层面验证),如果父类没有该方法,则会报错。
    2. 如果不写@Override注解,而父类仍有该方法,仍然构成重写。
    3. @Override只能修饰方法,不能修饰其他类,包,属性等等。
    4. 查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法
    5. @Target是修饰注解的注解……
  • @Deprecated:用于表示某个程序(类,方法等)已经过时
  • @Deprecated的说明
    1. 用于表示某个程序元素(类,方法等)已过时
    2. 可以修饰方法,类,字段,包,参数等等
    3. @Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARMETER,TYPE})
    4. @Deprecated的作用可以做到新旧版本的兼容和过渡
  • @SuppressWarnings:抑制编译期警告
  • 说明各种值
    1. unchecked是忽略没有使用的警告
    2. rawtypes是忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
    3. unused是忽略没有使用某个变量的警告错误
    4. @SuppressWarnings可以修饰的程序元素为,查看@Target
    5. 生成@SuppressWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)

JDK的元Annotation(元注解)

  • JDK的元Annotation用于修饰其他Annotation
  • 元注解的种类
    1. Retention //指定注解的作用范围,三种SOURCE,CLASS,RUNTIME
    2. Target //指定注解可以在哪些地方使用
    3. Documented //指定该注解是否会在javadoc体现
    4. Inherited //子类会继承父类注解
  • @Retention注解
    1. 说明
      • 只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值。
    2. @Rentention的三种值
      • RententionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的解释
      • RententionPolicy.CLASS:编译器将把注释记录在class文件中,当运行java程序时,JVM不会保留注解。这是默认值
      • RententionPolicy.RUNTIME:编译器将把注释记录在class文件中。当运行java程序时,JVM会保留注释,程序可以通过反射获取该注释。
        JAVA SE注解(Annotation)那些事
  • @Target
    1. 基本说明:
      • 用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
        JAVA SE注解(Annotation)那些事
  • @Document
    1. 基本说明
      • @Documented:用于指定该元Annotation修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注释。(说明:定义为Documented的注解必须设置Rentention值为RUNTIME)
        JAVA SE注解(Annotation)那些事
  • @Inherited注解
    1. 被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解(说明:实际应用中,使用较少,了解即可)

自定义Annotation

  • 定义新的Annotation类型使用@interface关键字
  • Annotation基本语法:
    JAVA SE注解(Annotation)那些事

静态引入

  • 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
  • 静态导入也是JDK5.0 引入的新特性。