AS運行Annotation

AS 運行 Annotation

注解分為運行時注解和編譯時注解

運行時注解

原理就是反射和代理(Proxy )

編譯時注解

通過apt(Annotation Processing Tools)技術(shù),原理是在某些代碼元素上(如類型、函數(shù)、字段等)添加注解,在編譯時編譯器會檢查 AbstractProcessor 的子類,并且調(diào)用該類型的process函數(shù),然后將添加了注解的所有元素都傳遞到process函數(shù)中,使得開發(fā)人員可以在編譯器進行相應(yīng)的處理,

步驟

  1. 使用 AS 創(chuàng)建一個 Android 項目,然后創(chuàng)建一個 module,一定要選擇 java library

  2. 設(shè)置 app 的 build.gradle,在 android 下添加

    compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_7
       targetCompatibility JavaVersion.VERSION_1_7
    }

在 java library 的 build.gradle 添加

sourceCompatibility = 1.7
targetCompatibility = 1.7
  1. 在 java library 創(chuàng)建注解類
    package com.major;

    public @interface CustomAnnotation {
    }
  1. 創(chuàng)建注解處理器
    package com.major;

    import java.util.Set;

    import javax.annotation.processing.AbstractProcessor;
    import javax.annotation.processing.RoundEnvironment;
    import javax.annotation.processing.SupportedAnnotationTypes;
    import javax.annotation.processing.SupportedSourceVersion;
    import javax.lang.model.SourceVersion;
    import javax.lang.model.element.TypeElement;

    @SupportedAnnotationTypes("com.major.CustomAnnotation")
    @SupportedSourceVersion(SourceVersion.RELEASE_7)
    public class CustomAnnotationProcessor extends AbstractProcessor {

        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {
            // doSomething
            return true;
        }
    }
  1. 創(chuàng)建 resources 告訴編譯器在編譯的時候使用哪個注解處理器
    • 在 java library 的 main 目錄下創(chuàng)建文件 resources/META-INF/services/javax.annotation.processing.Processor
    • 在文件中填寫處理器路徑
    com.major.CustomAnnotationProcessor
  1. 在 project 的 build.gradle 的 dependencies 添加 apt 插件
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  1. 編輯 app build.gradle
  • 添加 插件
    apply plugin: 'com.neenbedankt.android-apt'
  • 在 dependencies 添加依賴
    compile files('libs/processor.jar')
  • 創(chuàng)建 task 將把生成的 jar 文件復制到 app/libs 目錄中
    task processorTask(type: Copy) {
        from('../processor/build/libs/processor.jar')
        into('libs/')
    }

    processorTask.dependsOn(':processor:build')
    preBuild.dependsOn(processorTask)
  1. rebuild,然后可以在 app/libs 下看到生成的 lib 包

  2. 在 app 中調(diào)用注解

注:

  • Q: 如何獲取 java library 的 jar 包?
    A: 使用 app 依賴 java library 的模塊,然后可在 build/libs/ 下找到 jar 包

AnnotationProcessor 中調(diào)試代碼(未驗證)

  1. 設(shè)置gradle daemon端口和JVM參數(shù)。把下面兩行加入到你的gradle.properties文件。
    org.gradle.daemon=true
    org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  1. 運行命令 gradle daemon 來啟動守護線程。
gradle --daemon
  1. 在 process 方法中打斷點

  2. 建立 Remote Debugger
    Edit Configurations --> + --> Remote --> 填寫 host, port --> finish --> 點擊 debug 按鈕

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容