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 !