前言
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 {
...
}