前言
APT:Annotation Processor Tool(註解處理器)
什麼時註解處理器
註解處理器是(Annotation Processor) 是Javac的一個工具,其作用在編譯期間,用來處理加了註解的代碼,其會掃描編譯其的源碼獲得加了特定註解的目標代碼;
註解處理器的輸入數據爲:
- 1、java代碼或者編譯過的字節碼
輸出數據爲
- 1、java文件(生成的java文件不能修改,其將與手動編寫的java代碼一起參加javac的編譯過程)
註解處理器處理流程小結:
註解處理器開發
定義註解處理器
實現自己的註解處理器,我們需要定義一個類去繼承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; }}
方法說明
方法 | 說明 | 參數 |
---|---|---|
init(ProcessingEnvironment processingEnv) | 被註解處理工具調用 | 參數ProcessingEnvironment 提供了Element,Filer,Messager等工具 |
getSupportedAnnotationTypes() | 指定註解處理器是註冊給那一個註解的,它是一個字符串的集合,意味着可以支持多個類型的註解,並且字符串是合法全名。 | |
getSupportedSourceVersion | 指定Java版本 | |
process(Set annotations, RoundEnvironment roundEnv) | 這個也是最主要的,在這裏掃描和處理你的註解並生成Java代碼,信息都在參數RoundEnvironment 裏了 |
註冊註解處理器
定義好註解處理器之後,如何讓構建系統在編譯代碼時調用我們的處理器呢?此時我們就需要將些好的處理器註冊進構建系統的註解處理器集合裏面了
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 記錄的內容是我們要註冊的註解處理器,例如
com.example.myprocess.MyProcessorAcom.example.myprocess.MyProcessorB
2、優雅方法:
google提供了一個註冊處理器的庫:
compile 'com.google.auto.service:auto-service:1.0-rc2'
直接在自定義的註解類上使用@AutoService(Processor.class):
@AutoService(Processor.class)public class MyProcessor extends AbstractProcessor { ...}