0%

注解概述

注解的概念

​ 注解:
​ 用在类上,方法上,成员变量,构造器,…上对成分进行编译约束,标记等操作的。
​ 注解是JDK1.5的新特性。
​ 注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。
​ 注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。
​ 注解作用:
​ 1.标记。
​ 2.方法重写约束 @Override
​ 3.函数式接口约束。 @FunctionalInterface.
​ 4.现今最牛逼的框架技术多半都是在使用注解和反射。都是属于框架的底层基础技术。

自定义注解

1
2
3
4
自定义注解的格式:
修饰符 @interface 注解名{
// 注解属性
}

注解的属性

属性的格式
- 格式1:数据类型 属性名();
- 格式2:数据类型 属性名() default 默认值;

属性适用的数据类型:
八种数据数据类型(int,short,long,double,byte,char,boolean,float)
String,Class
以上类型的数组形式都支持
小结:
注解可以有属性,属性名必须带()
在用注解的时候,属性必须赋值,除非这个属性有默认值!!

注解的特殊属性名称

value
value属性,如果只有一个value属性的情况下,
使用value属性的时候可以省略value名称不写!!
但是如果有多个属性,且多个属性没有默认值,那么value是不能省略的。

元注解

元注解是sun公司提供的。
元注解是用在自定义注解上的注解。
元注解是用来注解自定义注解的。

 元注解有两个:
     @Target:约束自定义注解只能在哪些地方使用,
         -- 但是默认的注解可以在类,方法,构造器,成员变量,... 使用。

     @Retention:申明注解的生命周期
         -- 申明注解的作用范围:编译时,运行时。

 @Target
      * 作用:用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置。
      * 可使用的值定义在ElementType枚举类中,常用值如下
         TYPE,类,接口
         FIELD, 成员变量
         METHOD, 成员方法
         PARAMETER, 方法参数
         CONSTRUCTOR, 构造器
         LOCAL_VARIABLE, 局部变量

 @Retention
     作用:用来标识注解的生命周期(有效存活范围)
      * 可使用的值定义在RetentionPolicy枚举类中,常用值如下
      * SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在
      * CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
      * RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)
 小结:
    @Target约束自定义注解可以标记的范围。
    @Retention用来约束自定义注解的存活范围。

注解的解析(了解)

我们会使用注解注释一个类的成分,那么就设计到要解析出这些注解的数据。
开发中经常要知道一个类的成分上面到底有哪些注解,注解有哪些属性数据,这都需要进行注解的解析。

 与注解解析相关的接口
      1. Annotation: 注解类型,该类是所有注解的父类。注解都是一个Annotation的对象
      2. AnnotatedElement:该接口定义了与注解解析相关的方法
        所有的类成分Class, Method , Field , Constructor:都实现了AnnotatedElement接口
        他们都拥有解析注解的能力:
         a.Annotation[]	getDeclaredAnnotations()
            获得当前对象上使用的所有注解,返回注解数组。
         b.T getDeclaredAnnotation(Class<T> annotationClass)
             根据注解类型获得对应注解对象
         c.boolean isAnnotationPresent(Class<Annotation> annotationClass)
            判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

 解析注解数据的原理
     * 注解在哪个成分上,我们就先拿哪个成分对象。
     * 比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解
     * 比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
     * 比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解