本身動手寫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內容。
相關文章
相關標籤/搜索