定义
- 注解,就是元数据,即一种描述数据的数据。可以说,注解就是源代码的元数据,用来描述一个类、方法、参数、变量、构造器和包的一些特点,比如说某个方法是父类的重写,它的作用域在哪里等等。
 - 简单理解为一种标记,通过这个标记可以获取一定的关联信息。
举个栗子
 - 比如,下面这段代码:
 
- 上面代码中重写了toString方法并使用了@override注解,它告诉编译器这个方法是一个重写方法,如果父类中不存在该方法,编译器会报错,停水该方法没有重写父类中的方法。如果不小心拼写错误,而且也没有使用@override注解,那程序依然能编译运行,但运行结果就会和期望的大不相同。
优点
 - 在使用Annotation(注解)之前,xml被广泛地运用于描述元数据,但是其维护十分困难(因为代码繁琐与松耦合性,某些情况下甚至是完全分离的)。他们希望使用一些和代码紧耦合的东西。
 - 假如你想为应用设置很多的常量或参数,这种情况下,xml是很好的选择,因为它不会和特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注射和方法紧密结合。
 - 目前,许多框架将xml和Annotation两种方式结合起来,平衡两者的利弊。
 
元注解
- java提供了四种元注解,专门注解其他的注解。
 - @Documented–注解是否将包含在javadoc中
 - @Retention–在什么时期保存该注解(生命周期)
- RetentionPolicy.SOURCE–注解只保存在.java文件中,编译后被丢弃。这些注解在编译结束后就不再有意义,所以它们不会被写入字节码。如,@Override等。
 - RetentionPolicy.CLASS–保存到.class文件中,类加载(运行)时丢弃。注解默认使用这种方式。
 - RetentionPolicy.RUNTIME–始终不会丢弃。自定义注解通常使用的方式。
 
 @Target–注解作用于什么地方。若不明确指出,注解可以放在任何地方。
- ElementType.TYPE:用于描述类、接口或enum声明
 - ElementType.FIELD:用于描述实例变量
 - ElementType.METHOD
 - ElementType.PARAMETER
 - ElementType.CONSTRUCTOR
 - ElementType.LOCAL_VARIABLE
 - ElementType.ANNOTATION_TYPE 另一个注释
 - ElementType.PACKAGE 用于记录java文件的package信息
 
@Inherited–允许子类继承该注解
自定义注解
- 注解中所有的属性被定义成方法,并允许提供默认值。
 - 下面的例子有三个属性:author、priority和status。
 
- 注解的使用:
- @<注解名>(<成员1>=<成员1值>,<成员2>=<成员2值>,…)
 
 - 下面的例子演示了如何使用上面的注解:
 
- 如果注解中只有一个属性,可以直接命名为“value”,使用时无需再标明属性名。
 
解析注解
- 利用反射将被注解的类或方法等的注解信息解析出来(获取注解信息)
 - 下面这个注解是用来描述类或方法的
 
- 下面的例子使用了上面的注解
 
- 对这个类及其方法解析一下注解(看看注释知道个大概就行了)
 
- 运行结果