Anroid APT

http://image.catbro.cn/upload_88e168a529af9a66cde8d01ac0341391.png

前言

APT:Annotation Processor Tool(注解處理器)

什么時注解處理器

注解處理器是(Annotation Processor) 是Javac的一個工具,其作用在編譯期間,用來處理加了注解的代碼,其會掃描編譯其的源碼獲得加了特定注解的目標(biāo)代碼;
注解處理器的輸入數(shù)據(jù)為:

  • 1、java代碼或者編譯過的字節(jié)碼

輸出數(shù)據(jù)為

  • 1、java文件(生成的java文件不能修改,其將與手動編寫的java代碼一起參加javac的編譯過程)

注解處理器處理流程小結(jié):

graph TD
    標(biāo)記了注解的類 --> 注解處理器處理 --> 輸出Java代碼

注解處理器開發(fā)

定義注解處理器

實現(xiàn)自己的注解處理器,我們需要定義一個類去繼承AbstractProcessor類

  • 處理器的寫法有固定的套路,示例代碼如下
public class MyProcessor extends AbstractProcessor {

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
    }

    @Override
    public Set getSupportedAnnotationTypes() {
        return null;
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

    @Override
    public boolean process(Set annotations, RoundEnvironment roundEnv) {
        return true;
    }
}

方法說明

方法 說明 參數(shù)
init(ProcessingEnvironment processingEnv) 被注解處理工具調(diào)用 參數(shù)ProcessingEnvironment 提供了Element,F(xiàn)iler,Messager等工具
getSupportedAnnotationTypes() 指定注解處理器是注冊給那一個注解的,它是一個字符串的集合,意味著可以支持多個類型的注解,并且字符串是合法全名。
getSupportedSourceVersion 指定Java版本
process(Set annotations, RoundEnvironment roundEnv) 這個也是最主要的,在這里掃描和處理你的注解并生成Java代碼,信息都在參數(shù)RoundEnvironment 里了

注冊注解處理器

定義好注解處理器之后,如何讓構(gòu)建系統(tǒng)在編譯代碼時調(diào)用我們的處理器呢?此時我們就需要將些好的處理器注冊進(jìn)構(gòu)建系統(tǒng)的注解處理器集合里面了
1、低效方法:
打包注解處理器的時候需要一個特殊的文件 javax.annotation.processing.Processor 在 META-INF/services 路徑下

--myprcessor.jar
----com
------example
--------MyProcessor.class
----META-INF
------services
--------javax.annotation.processing.Processor

javax.annotation.processing.Processor 記錄的內(nèi)容是我們要注冊的注解處理器,例如

com.example.myprocess.MyProcessorA
com.example.myprocess.MyProcessorB

2、優(yōu)雅方法:
google提供了一個注冊處理器的庫:

compile 'com.google.auto.service:auto-service:1.0-rc2'

直接在自定義的注解類上使用@AutoService(Processor.class):

@AutoService(Processor.class)
public class MyProcessor extends AbstractProcessor {
      ...
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容