注解的作用:
1、生成文档。这是最常见的,也是java最早提供的注解。常用的有@see @param @return 等
2、跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,这样javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,根据标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
注解消费器:它们是利用被注解代码并根据注解信息产生不同行为的系统或者应用程序。
声明一个注解需要使用“@”作为前缀,这便向编译器说明,该元素为注解.多个注解可以使用在同一代码上.
以键值对的形式持有有很多元素,即注解的属性。小括号
@Annotation(
info= "I am an annotation",
counter = "55"
)
public void annotatedMehod() {
...
}
Meta注解,它们的目的注解其他注解:
@Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。
@Target:这个注解用于限制某个元素可以被注解的类型。
@Documented:被注解的元素将会作为Javadoc产生的文档中的内容。
@Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。
@Deprecated:说明被标记的元素不应该再度使用。这个注解会让编译器产生警告消息。可以使用到方法,类和域上。
@SuppressWarnings:说明编译器不会针对指定的一个或多个原因产生警告。
@SuppressWarnings( "unused")
private String myNotUsedMethod(){
...
}
通常,编译器会因为没调用该方而产生警告; 用了注解抑制了这种行为。该注解需要一个或多个参数来指定抑制的警告类型。
@Override:向编译器说明被注解元素是重写的父类的一个元素。在重写父类元素的时候此注解并非强制性的,不过可以在重写错误时帮助编译器产生错误以提醒我们。比如子类方法的参数和父类不匹配,或返回值类型不同。
反射获取注解:
Java反射API包含了许多方法来在运行时从类,方法或者其它元素获取注解。接口AnnotatedElement包含了大部分重要的方法,如下:
getAnnotations(): 返回该元素的所有注解,包括没有显式定义该元素上的注解。
isAnnotationPresent(annotation): 检查传入的注解是否存在于当前元素。
getAnnotation(class): 按照传入的参数获取指定类型的注解。返回null说明当前元素不带有此注解。
自定义注解:
定义新的Annotation类型使用@interface关键字(在原有interface关键字前增加@符号)。定义一个新的Annotation类型与定义一个接口很像,例如:
public @interface Test{
}
定义完该Annotation后,就可以在程序中使用该Annotation。使用Annotation,非常类似于public、final这样的修饰符,通常,会把Annotation另放一行,并且放在所有修饰符之前。例如:
@Test
public class MyClass{
....
}
Annotation只有成员变量,没有方法。Annotation的成员变量在Annotation定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。例如:示例中定义了2个成员变量,这2个成员变量以方法的形式来定义。
public @interface MyTag{
string name();
int age();
}
一旦在Annotation里定义了成员变量后,使用该Annotation时就应该为该Annotation的成员变量指定值。例如:
public class Test{
@MyTag(name="红薯",age=30)
public void info(){
......
}
}
也可以在定义Annotation的成员变量时,为其指定默认值,指定成员变量默认值使用default关键字。示例:
public @interface MyTag{
string name() default "我兰";
int age() default 18;
}
为了获取注解信息,必须使用反射知识。
如果想要在运行时提取注解信息,在定义注解时,该注解必须使用@Retention(RetentionPolicy.RUNTIME)修饰。即通过这个注解修饰一个新的注解。