定义:
注解历史:jdk5的新特性,在5之前一般都是用xml搭配反射机制,但这样搭配程序会很分散,由此注解诞生,完美体现出高内聚低耦合的特性,代码可读性更强。
什么是注解(annotation):它是一个存储元数据的一个接口,可以通过反射机制来获取到指定程序元素的annotation对象(注解对象就是注解起作用的地方),然后通过注解对象来获取注解里的元数据。
注解并不会影响一个程序的执行或它本身的状态
元数据(metadata):数据的数据,作用(用来约束数据的整体结构),如果元数据不好理解可以联想一下元注解,比如@Target({ElementType.METHOD,ElementType.TYPE}),这个元注解作用是规范了注解作用地方,此例规范注解作用在类和方法上,元数据那么就好理解了,它本质就是在定义/规范/约束数据的一个数据;
理解了元数据,那么注解就好理解了,(一个存储元数据的接口);
元数据几种常见作用:
①生成文档:这是最常见的,也是java 最早提供的注解。常用的有@param @return 等;
② 跟踪代码依赖性,实现替代配置文件功能。常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。;
③在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
jdk5定义的元注解
@Retention(生命周期):通过它定义了一个注解 的生命周期
1.SOURCE:在源文件中有效(即源文件保留),比如:@override什么周期就是source,检测子类中方法是否与父类方法对应,当子类用@override重写的方法父类没有就会报错
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Target:定义了注解作用地方
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Inherited:
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Documented:
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
相关注解的解释可参考:https://www.cnblogs.com/peida/archive/2013/04/24/3036689.html