Java中的註解-自定義註解處理器

Java中的註解-自定義註解處理器

Hello,你們好,上篇文章Java中的註解-自定義註解和你們分享瞭如何自定義一個註解,文章最後也和你們分享了自定義註解如何使用,除了和Spring整合使用外,沒有註解處理器,那自定義註解實際上是沒什麼鳥用的。這一篇就和你們分享下如何實現註解的處理器。文章結構:java

  1. 註解處理器的本質
  2. 自定義註解處理器

1. 註解處理器的本質

名字聽起來高大上,註解處理器,其實不是什麼高端的東西,說白了,就是JDK的反射裏面的幾個API,這些API能夠拿到註解的內容.JDK定義了一個接口AnnotatedElement,經過這個接口的如下4個API能夠拿到註解的信息:數組

  • T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定類型的註解,若是該類型註解不存在,則返回null。
  • Annotation[] getAnnotations():返回該程序元素上存在的全部註解。
  • boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程序元素上是否包含指定類型的註解,存在則返回true,不然返回false.
  • Annotation[] getDeclaredAnnotations():返回直接存在於此元素上的全部註釋。與此接口中的其餘方法不一樣,該方法將忽略繼承的註釋。(若是沒有註釋直接存在於此元素上,則返回長度爲零的一個數組。)該方法的調用者能夠隨意修改返回的數組;這不會對其餘調用者返回的數組產生任何影響。

那麼問題來了,AnnotatedElement接口的實現類有哪些呢?這就更簡單了,其實就是反射裏的反射元素:bash

  • Class:類定義
  • Constructor:構造器定義
  • Field:類的成員變量定義
  • Method:類的方法定義
  • Package:類的包定義

寫到這,老Coder應該就已經明白啥是註解處理器了,說白了,就是經過反射拿到反射元素,而後根據這些元素拿到這些元素上面的註解,而後作一些自定義的處理post

2. 自定義註解處理器

好了,上面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 !

相關文章
相關標籤/搜索