app.build.gradle
compiler.builder.gradle
annotations.builder.gradle
MainActivity
ARouter
ArouterProcessor注解处理器如下:
package com.e.compiler;
import com.google.auto.service.AutoService;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedOptions;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.tools.Diagnostic;
@AutoService(Processor.class) // 启用服务
@SupportedAnnotationTypes({“com.e.arouter_annotations.ARouter”}) // 把注解告诉注解处理器ArouterProcessor
@SupportedSourceVersion(SourceVersion.RELEASE_7) // 环境的版本
// 接收 安卓工程传递过来的参数
@SupportedOptions(“student”) // 通过字段student,来接收安卓工程传过来的数据
public class ARouterProcessor extends AbstractProcessor {
// 操作Element的工具类(类,函数,属性,其实都是Element)
private Elements elementTool; // 比如:MainActivity使用了注解,就是可以通过element操作MainActivity,以及这个类里的方法,属性
// type(类信息)的工具类,包含用于操作TypeMirror的工具方法
private Types typeTool; // 类的细节,如类的继承或实现,通过Types来维护
// 调试注解器:Message用来打印 日志相关信息
private Messager messager; // 这个是java 工程,不能用安卓的Log来输出日志
// 文件生成器, 类 资源 等,就是最终要生成的文件 是需要Filer来完成的
private Filer filer;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
elementTool = processingEnvironment.getElementUtils();
messager = processingEnvironment.getMessager();
filer = processingEnvironment.getFiler();
// 获取从安卓工程传过来的数据
String value = processingEnvironment.getOptions().get("student");
// 这个代码已经下毒了
// 打印输出一下;如果我想在注解处理器里面抛出异常 可以使用Diagnostic.Kind.ERROR
messager.printMessage(Diagnostic.Kind.NOTE, "init value:" + value);
}
// 在编译的时候,会执行这个process方法,在这里可以写自己的逻辑
/**
* 坑:如果没有在任何地方使用,次函数是不会工作的,如下,是在MainActivity中使用了
* @Arouter(path = "MainActivity")
* public class MainActivity extends AppCompatActivity {。。。}
* */
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
messager.printMessage(Diagnostic.Kind.NOTE, "process start");
return false;
}
}