1.概念

注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解!
Java注解(Annotation)也叫做元数据,以@注解名在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。

2.注解类型

Java注解按照含有参数的个数分为三种:
不带参数,语法结构为:@Annotation,例如@FunctionalInterface;
带一个参数的注解,语法结构为:@Annotation(参数);
带多个参数的注解,语法结构为:@Annotation(参数1,参数2,参数3…)。

3.注解的定义

[public] @interface 注解名{
数据类型 属性名()[default 默认属性值];
[属性2;]

[属性n;]
}
注意:
1.如果注解属性没有默认值,则使用该注解时必须指定值(否则会报错)。
2.如果注解属性名为value,且只有它一个属性时,使用该注解可以直接赋值,即@Autowried(“”) 等价于 @Autowried(value = “”)
3.如果注解属性的数据类型为数组类型,赋多个值时必须使用{}括起来;但若只赋一个值时,则无需使用{}。

4.元注解

元注解是Java语言中用于修饰自定义注解的注解,常用的元注解有:@Target,@Retention,@Documented,@Inherited和@Repeatable,其中@Repeatable是JDK8.0新添加的元注解。

4.1 @Target:

用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元素有如下属性值:
ElementType.ANNOTATION_TYPE:应用于其他注解的元注解;
ElementType.CONSTRUCTOR:应用于构造函数;
ElementType.FIELD:应用于全局属性;
ElementType.LOCAL_VARIABLE:应用于方法中的本地变量;
ElementType.METHOD:应用于方法;
ElementType.PACKAGE:应用于包;
ElementType.PARAMETER:应用于方法的参数;
ElementType.TYPE:应用于类、接口或者枚举声明。

4.2 @Retention:

用于指定被修饰的自定义注解可以保留多久,该元注解有如下属性值:
RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解(也就是说编译器将源码编译成class文件时直接丢弃,自定义注解不会出现在class文件中);
RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,但是当运行Java程序时,虚拟机不再保留自定义注解(也就是说源码和class文件中有自定义注解,但Java程序运行时没有);
RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行Java程序时,虚拟机保留注解,程序可以通过反射获取该注解;

3.3 @Documented(不常用):

执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中。

3.4 @Inherited(不常用):

如果父类所使用的注解被@Inherited修饰,则子类可以继承该注解,(否则不能继承)。

3.5 @Repeatable(不常用):

所修饰的自定义注解可以重复在同一个类、方法或变量上使用。

总结

注解就是增强型的注释(可被计算机识别的注释),本质是接口。把握住这两点,就非常好理解注解与它的各种规则,行为。注解本身并没有任何功能(因为它只是注释,本质也只是接口),需要其他代码支撑,它才能体现价值。
个人认为此话说的并不准确,注解更像是一个标记,通过反射获取判断是否有此标记。