Android編譯時間註解架構系列2-Run樣本

來源:互聯網
上載者:User
概述
先講一下編寫《Android編譯時間註解架構》的初衷吧,APT其實並不難,可以說是簡單且高效,但關於 APT的資料卻並不多,甚至很多人都不知道這麼一個技術。國內關於APT的部落格屈指可數,唯二找到的幾篇初級講解一個是用Eclipse寫得,一個是用 AndroidStudio加Intellij。剛開始著實踩了不少坑,但事實是,APT完全可以用AndroidStudio單獨實現。光是項目搭建就如此麻煩了,更別提文法講解了。資料匱乏無疑提高了APT的入門門檻。
正因為如此,這個系列部落格就這樣誕生啦~現在就教你用AndroidStudio一步步打造自己的APT架構。
以我自己的學習習慣來講,比起前期大量枯燥的基礎知識積累,我更喜歡先把項目跑起來再說,雖然會不明所以,但反而會促進學習興趣,並且在有結果的情境下一步步深入。
所以作為《Android編譯時間註解架構》系列的第二篇,我們不管三七二十一,先把APT跑起來再說,看看這到底是個什麼東西。跑起來,就入門啦!
在Running的過程中,有很多文法,我們都暫時一併跳過,都放到《Android編譯時間註解架構-文法講解》統一講。
Running
項目搭建
首先建立一個Android項目
然後給我們的項目增加一個module,一定要記得是Java Library.
因為APT需要用到jdk下的 【 javax.~ 】包下的類,這在AndroidSdk中是沒有的。
自訂註解
建立一個類,GetMsg。就是我們自訂的註解。
這是一個編譯時間註解,用 @Retention(RetentionPolicy.CLASS)修飾。
這個註解只能修飾方法。用 @Target(ElementType.METHOD)修飾。
且這個註解可以設定兩個值。id和name。name是有預設值的,可以不設定。
建立Processor
Processor是用來處理Annotation的類。繼承自AbstractProcessor。
複寫AbstractProcessor兩個最重要的方法。
process方法是用來處理註解的,我們一會寫。
getSupportedAnnotationTypes用來表示該Processor處理哪些註解。這裡我們只有一個 GetMsg註解需要處理。
重寫process方法
我們的目的呢,是擷取修飾了GetMsg註解的方法所有資訊,只有獲得了這些資訊,才有依據產生代碼不是嗎?
@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {    Messager messager = processingEnv.getMessager();    for (Element element : env.getElementsAnnotatedWith(GetMsg.class)) {        PackageElement packageElement = (PackageElement) element                .getEnclosingElement();        //擷取該註解所在類的包名        String packageName = packageElement.getQualifiedName().toString();        TypeElement classElement = (TypeElement) element;        //擷取該註解所在類的類名        String className = classElement.getSimpleName().toString();        //擷取該註解所在類的全類名        String fullClassName = classElement.getQualifiedName().toString();        VariableElement variableElement = (VariableElement) element.getEnclosingElement();        //擷取方法名        String methodName = variableElement.getSimpleName().toString();        //擷取該註解的值        int id = classElement.getAnnotation(GetMsg.class).id();        String name = classElement.getAnnotation(GetMsg.class).name();        messager.printMessage(Diagnostic.Kind.NOTE,                "Annotation class : packageName = " + packageName);        messager.printMessage(Diagnostic.Kind.NOTE,                "Annotation class : className = " + className);        messager.printMessage(Diagnostic.Kind.NOTE,                "Annotation class : fullClassName = " + fullClassName);        messager.printMessage(Diagnostic.Kind.NOTE,                "Annotation class : methodName = " + methodName);        messager.printMessage(Diagnostic.Kind.NOTE,                "Annotation class : id = " + id + "  name = " + name);    }    return true;}
簡單介紹一下代碼:
1.Messager 用來輸出。就像我們平時用的System.out.pringln()和Log.d。輸出位置在編譯器下方的Messages視窗。這裡System.out也是可以用的哦~
2.用for迴圈遍曆所有的 GetMsg註解,然後進行處理。
3.Diagnostic.Kind.NOTE 類似於Log.d Log.e這樣的等級。
4.return true;表示該Process已經處理了,其他的Process不需要再處理了。
配置
一定不能忘記的檔案配置。
在main檔案夾下建立一個resources.META-INF.services檔案夾,建立檔案
javax.annotation.processing.Processor
檔案內容是Process類的包名+類名
忘記這個設定檔的後果就是,註解無法生效。
編譯jar
這裡有一個坑,我們的主Module是不可以直接引用這個java Module的。(直接引用,可以成功運行一次~修改代碼以後就不能運行了)
而如何單獨編譯這個java Module呢?
在編譯器Gradle視圖裡,找到Module apt下的build目錄下的Build按鈕。雙擊運行。
代碼沒有問題編譯通過的話,會有BUILD SUCCESS提示
產生的jar包在 apt 下的build目錄下的libs下
將apt.jar拷貝到app下的libs目錄,右鍵該jar,點擊Add as Library,添加Library.
在APP項目中使用該註解GetMsg。運行。
當你apt這個包的代碼有修改時,需要重複2.6這個步驟。這是比較煩的,但是沒辦法
運行結果
總結
這個Demo只是使用了註解,並且根據註解得到一些必要的資訊。沒有做代碼產生的操作,產生代碼的具體操作我們放到後面開始寫架構時再講。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.