1. 对Class、Method、Field以及Constructor对象调用getAnnotation()方法,可以获得与对象关联的特定信息。该方法的一般形式如下:
<A extends Annotation> getAnnotation(Class<A> annoType)
其中,annoType是表示您感兴趣注解的Class对象。该方法返回对注解的一个引用,使用这个引用可以获取与注解成员关联的值。如果没有找到注解,该方法会返回null。如果注解的保留策略不是RUNTIME,就会出现这种情况。
自定义一个注解(需要注意的是注解的保留策略)
import java.lang.annotation.*;
import java.lang.reflect.*;
// An annotation type declaration.
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String str();
int val();
}
自定义一个类Meta(注意获取注解成员属性的方法)
class Meta {
// myMeth now has two arguments.
@MyAnno(str = "Two Parameters", val = 19)
public static void myMeth(String str, int i)
{
Meta ob = new Meta();
try {
Class<?> c = ob.getClass();
// Here, the parameter types are specified.
Method m = c.getMethod("myMeth", String.class, int.class);
MyAnno anno = m.getAnnotation(MyAnno.class);
System.out.println(anno.str() + " " + anno.val());
} catch (NoSuchMethodException exc) {
System.out.println("Method Not Found.");
}
}
public static void main(String args[]) {
myMeth("test", 10);
}
}
2. 获取所有注解
可以获取与某个条目关联的具有RUNTIME保留策略的所有注解,具体方法是为该条目调用getAnnotations()方法。该方法的一般形式如下:
Annotation[ ] getAnnotations( )
上述方法返回一个注解数组。
这里说明下,因为想要获取业务日志,所以当初的想法是利用AOP获取相应方法的注解,然后注解中描述业务操作信息,但是因为在业务层中添加注解的话,一个业务操作可能涉及多个表的信息,无法准确知道具体的变化的信息,而且还无法判断事务是否一定完成。关于业务日志的还没有好的解决方案。