1、什么是注解?
- 注解在形式上是标签(协议、方法集合、方法声明),其本质上是通过标签进行映射,实现从依赖性关系到映射性关系(松耦合);
- 注解的本体:注解本体是一个接口,是一个协议,通过协议实现依赖关系的映射;
- 注解的实现原理:JDK(或者框架)通过动态代理(反射)生成该注解的一个代理类,该代理类一般由框架管理;从而实现创建权(自洽)和使用权(关系)的分离;
- 追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。相对于XML,注解选择效率与耦合的平衡;
2、注解的定义和作用目标
- 注解的定义:
- 注解中的成员变量只有属性,不能拥有成员方法;(以方法名称为属性名称的形式,让方法形成新的元数据结构,更抽象的表示被代理的方法,其成员变量映射被代理方法的参数);
- 注解中的成员变量属性类型限定:八种基本数据类型、String、注解(作为成员属性不加@)‘、Class类型、枚举,及以上数据类型的一维数组。
- 作用目标
- 包(一般不用)、类上、属性上(不建议,不符合类思想)、方法上、方法参数上,本地局部变量上;
3、注解的分类
- 元注解:修饰注解的注解,用于指定注解的作用目标和生命周期
-
@Target:注解作用目标
-
@Retention:注解生命周期:
Source(仅存编译期)、
Class(在Class文件中,加载舍去,不在JVM中)、
Runtime(始终存在,可反射);
-
@Documented:注解是否应当包含在JavaDoc文档中;
-
@Inherited:注解是否可以被继承;
-
编译期的注解:用于编译器期的检测,是JDK内置的几个注解,只有说明作用,如下:
- @Override:重写父类方法;
- @Deprecated:过时的;
- @SuppressWarnings:压制Java警告;
4、注解的实现
- JDK(或者框架)通过动态代理(反射)生成该注解的一个代理类,该代理类一般由框架管理;
- 反射实现过程:
- 以键值对的形式为注解赋值
- 判断该注解的生命周期(保留或舍去)
- 将注解写入元素的属性表
- 将属性表中的RUNTIME的注解传递给AnnotationInvocationHandler 的一个实例,该实例通过invoke方法实现代理逻辑;
- 注解(协议)根本形式就是:通过方法名(方法声明、协议)返回注解值;可以理解为注解的形式就是抽象方法的集合;
5、通过注解理解Java的变异(适应协议:它恰)
- 动态代理的起点是类对象的方法,由代理对象的方法(可织入功能形成新的业务逻辑、面向切面)代替类对象方法,而类对象只提供固有逻辑(功能:数据+逻辑);
- 代理对象本质上是对象的虚拟化,淡化了必须通过对象调用方法的约束;
- 将代理对象交由框架生成、实现,实现面向接口(方法声明、协议)编程的思想理念;
- 所谓注解中的value特权,代表着方法重载的唯一性(可被推理的唯一性);