本身动手写APT和AST

juejin.im/post/5d9096… juejin.im/post/5d909a…java

经过上面两篇文章的学习,咱们已经对AST有了初步的了解,下面能够本身编写代码来进行实战。jvm

AndroidStudio 搭建APT和AST步骤

1. 建立java-library Module

2. buile.gradle中添加依赖

implementation 'com.google.auto.service:auto-service:1.0-rc5'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
复制代码

注意:auto-service在1.0-rc4以上版本,要同时使用implemetation和annotationProcessor添加引用,不然没法执行自定义的Processor类。ide

3. AST功能须要添加tools.jar

compileOnly files(org.gradle.internal.jvm.Jvm.current().getToolsJar())
复制代码

若是不添加,在编译阶段会报错找不到tools.jar中的类post

4. 编写代码

@AutoService(Processor.class)
public class CompAnnotationProcessor extends AbstractProcessor {
    // AST树
    private Trees trees;
    private TreeMaker treeMaker;
    private Names names;

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

        typeUtils = processingEnvironment.getTypeUtils();

        messager = processingEnvironment.getMessager();
        messager.printMessage(Diagnostic.Kind.NOTE, "***************** CompAnnotationProcessor init *************");

        trees = Trees.instance(processingEnvironment);

        Context context = ((JavacProcessingEnvironment)processingEnvironment).getContext();
        names = Names.instance(context);
        treeMaker = TreeMaker.instance(context);
    }
    
    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        ......
    }
}
复制代码

注意学习

  • 若是Module的build下没有生成javax.annotation.processing.Processor,说明Processor配置有问题。
  • 日志输出,正常日志不要使用Kind.ERROR,不然会提示build失败。
  • AST功能,只须要更改语法树的内容,便可更改最终生成的class内容。
相关文章
相关标签/搜索