关于java的Annotation是如何被利用上的,之前一直有些迷惑,今天算是弄懂了,如果有理解不当之处,希望大家指教批评!
我的理解:我们自己写了一个Annotation,定义了其属性(其实就是一个个的方法,属性名就是方法名),@Target和@Retention等元Annotation也都设定好了,那么这个自定义的Annotation是如何为我们的业务代码服务的呢?一定要写一个这个Annotation的处理器(名字听上去好像挺高大上似的,其实一个方法就可以搞定,感觉业界中很多时候都是把名字弄得很响亮,其实说白了都没什么),这个处理器读取这个Annotation的属性(利用反射机制),再根据属性来判断我们要做的操作,完成相应的逻辑。
下面是我写的一段代码,是控制是否打印的一个Annotation,很简单,但自认为可以说明问题
自定义的Annotation:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
boolean isPrint() default true;
}
客户端:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class test {
private static int id = 0;
public static void main(String[] args) {
test t = new test();
try {
action(t);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@MyAnnotation(isPrint = true)
public static void temp() {
System.out.println("我被打印啦!!!");
}
处理Annotation的方法(处理器)
public static void action(Object obj)
throws InvocationTargetException, IllegalAccessException {
Method[] methods = obj.getClass().getDeclaredMethods();
for (Method mt : methods) {
MyAnnotation myAnnotation = mt.getAnnotation(MyAnnotation.class);
boolean result = false;
if (null != myAnnotation) {
result = myAnnotation.isPrint();
}
if (result) {
// 执行打印
mt.invoke(obj);
}
}
}
}