Hello,你们好,上篇文章Java中的注解-自定义注解和你们分享了如何自定义一个注解,文章最后也和你们分享了自定义注解如何使用,除了和Spring整合使用外,没有注解处理器,那自定义注解实际上是没什么鸟用的。这一篇就和你们分享下如何实现注解的处理器。文章结构:java
名字听起来高大上,注解处理器,其实不是什么高端的东西,说白了,就是JDK的反射里面的几个API,这些API能够拿到注解的内容.JDK定义了一个接口AnnotatedElement,经过这个接口的如下4个API能够拿到注解的信息:数组
那么问题来了,AnnotatedElement接口的实现类有哪些呢?这就更简单了,其实就是反射里的反射元素:bash
写到这,老Coder应该就已经明白啥是注解处理器了,说白了,就是经过反射拿到反射元素,而后根据这些元素拿到这些元素上面的注解,而后作一些自定义的处理。post
好了,上面balabala半天理论,这一篇来点实战的,说下场景,要求自定义一个注解用于标注到类的方法上,来控制该方法是否被调用。spa
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
public String action() default "0";
}
复制代码
定义一个Action注解,action属性为0时,表示调用,为其余时表示不被调用.code
public class ActionHandle {
public static void action(Object obj) throws InvocationTargetException, IllegalAccessException {
Method[] methods = obj.getClass().getDeclaredMethods();
for(Method mt : methods){
Action ac =(Action) mt.getAnnotation(Action.class);
String result =ac.action();
if(result.equals("0")){
// 0 表示要执行
mt.invoke(obj);
}
}
}
}
复制代码
自定义注解处理器,根据反射拿到Object的全部方法Method,而后遍历拿到Method上面的Action注解,判断action属性值,为0就调用,不为0就不调用. 贼简单..继承
public class Dog {
@Action
public void say(){
System.out.println("小狗会说话...");
}
@Action(action = "1")
public void sing(){
System.out.println("小狗会唱歌...");
}
}
复制代码
定义一个Dog类,say()方法会被调用,sing()方法不会被调用.接口
Dog dog =new Dog();
ActionHandle.action(dog);
复制代码
打印结果:get
小狗会说话...
复制代码
能够看到,只有action属性为0的才会调用,为其余的值是不会被调用的.string
是否是很easy....
好了,自定义注解处理器也和你们分享完了,老实说,不是什么技术活,贼简单的。就是根据反射元素的一些API拿到上面的注解,和注解属性,来作一些自定义操做。最近天气转冷,你们注意保暖,我这边冻成狗了。Over,Have a good day !