您的位置:

Annotation Processor:从Factory到Environment

一、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集合库。