一、 定义
Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现。
二、 代码案例
1. 定义注解
package annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public@interfaceMyAnnotation {
String[] value() default"abc";
}
2. 属性注解
package annotation;
import java.lang.reflect.Field;
publicclass AttributeAnnoTest {
@MyAnnotation("11")
public String str;
publicstaticvoid main(String[] args) {
try {
AttributeAnnoTest test = new AttributeAnnoTest();
Field field = AttributeAnnoTest.class.getField("str");
//判断该属性是否包含MyAnnotation注解
if (field.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
field.set(test, annotation.value()[0]);
System.out.println(test.str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:11
3. 方法注解
package annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
publicclass FunctionAnnoTest {
@MyAnnotation(value={"1","2"})
publicvoid test(String s1, String s2){
System.out.println("s1=" + s1 + ", s2="+ s2);
}
publicstaticvoid main(String[] args) {
try {
FunctionAnnoTest test = new FunctionAnnoTest();
Method method = FunctionAnnoTest.class.getMethod("test", new Class[]{String.class, String.class});
if (method.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String[] values = annotation.value();
method.invoke(test, values);
}
//获取方法上的所有注解
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations){
System.out.println(annotation);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
s1=1, s2=2
@annotation.MyAnnotation(value=[1,2])
三、 总结
1. 使用自定义注解处理应用中的一些监听事件如:
1) 监控需要关心的sql执行的时间
2) 监控访问的页面执行时间
2. 依赖注入
3. 序列化@XStreamAlias
4. AOP