一、AnnotationProcessorFactory
Annotation Processor用於在編譯期間處理注釋信息。AnnotationProcessorFactory(以下簡稱APF)是將Annotation Processor與javac編譯器進行連接的介面。APF將java文件傳遞給Annotation Processor並返回它處理器處理後的結果。
APF主要有三個方法:
public Collection supportedOptions(); //返回可支持的命令行選項 public Collection supportedAnnotationTypes(); //返回支持處理的所有注釋類型 public AnnotationProcessor getProcessor(String annotationType); //根據注釋類型返回對應的Annotation Processor處理器實例
APF的實現示例:
@SupportedAnnotationTypes("com.example.TestAnnotation")
public class TestAnnotationProcessorFactory extends AbstractProcessor implements AnnotationProcessorFactory {
@Override
public Collection supportedOptions() {
return Collections.emptySet();
}
@Override
public Collection supportedAnnotationTypes() {
return Collections.singleton(TestAnnotation.class.getCanonicalName());
}
@Override
public AnnotationProcessor getProcessorFor(Set atds, AnnotationProcessorEnvironment env) {
return new TestAnnotationProcessor(env);
}
}
二、Annotation Processor
Annotation Processor是Annotation Processing工具的核心部分。它可以用於檢索、分析和處理注釋信息。關於Annotation Processor的實現,需要實現以下步驟:
1. 通過編寫標記注釋,選擇需要處理的對象
2. 創建Annotation Processor類來處理標記注釋
3. 在META-INF/services/javax.annotation.processing.Processor文件中為Annotation Processor指定類名
Annotation Processor的實現示例:
@SupportedAnnotationTypes("com.example.TestAnnotation")
public class TestAnnotationProcessor extends AbstractProcessor {
private AnnotationProcessorEnvironment env;
public TestAnnotationProcessor(AnnotationProcessorEnvironment env) {
this.env = env;
}
@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) {
//TODO 處理標記注釋
return true;
}
}
三、Annotation Processor Environment
Annotation Processor Environment(以下簡稱APE)是Annotation Processor的執行環境,它提供了用於與編譯器交互的API。
APE主要有以下API:
public TypeElement getTypeElement(CharSequence name); //根據名稱返回類型元素 public boolean isSource(Element element); //返回元素是否源文件中定義的 public Filer getFiler(); //返回用於創建新文件、類或其他資源的Filer public Messager getMessager(); //返回用於報告錯誤、警告和其他消息的Messager public Map getOptions(); //返回options參數的映射,這些參數可以在APF中處理
APE的使用示例:
public class TestAnnotationProcessor extends AbstractProcessor {
private Filer filer;
private Messager messager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
filer = processingEnv.getFiler();
messager = processingEnv.getMessager();
}
@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) {
TypeElement testAnnotationElement = processingEnv.getElementUtils().getTypeElement("com.example.TestAnnotation");
//TODO 處理標記注釋
return true;
}
}
四、annotation processor – csdn
annotation processor – csdn是一個開源的Annotation Processor集合庫。使用這個庫可以方便地完成Annotation Processing的工作。
annotation processor – csdn主要有以下特點:
1. 提供了一組常用的Annotation類型的處理器
2. 可以根據自己的需求擴展Annotation類型和Annotation Processor
3. 可以在命令行或Gradle插件中使用
annotation processor – csdn示例:
compile 'com.bugdim88.processor:annotation-processor-csdn:1.0.3'
@Retention(RetentionPolicy.CLASS)
public @interface TestAnnotation {
String value();
}
@AutoService(Processor.class)
public class TestAnnotationProcessor extends BaseProcessor {
private ProcessingEnvironment processingEnv;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.processingEnv = processingEnv;
}
@Override
public Set getSupportedAnnotationTypes() {
Set types = new HashSet();
types.add(TestAnnotation.class.getCanonicalName());
return types;
}
@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) {
for (TypeElement element : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(TestAnnotation.class))) {
//TODO 處理標記注釋
}
return true;
}
}
五、結語
Annotation Processor是在編譯期對注釋信息進行處理的工具,能夠有效地提高代碼的可讀性和可維護性。Annotation Processor Factory是Annotation Processor和javac編譯器之間的連接介面,Annotation Processor是Annotation Processing工具的核心部分,Annotation Processor Environment是Annotation Processor的執行環境,annotation processor – csdn是一個開源的Annotation Processor集合庫。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249104.html
微信掃一掃
支付寶掃一掃