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