一、APT技术
全称annotations processor tool,apt技术是在编译成class文件时进行的。
二、apt使用
1、定义注解(创建一个新的java library)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface ThorAnno {
String value();
}
2、创建注解解析器(创建新的java library)
2.1、注解解析器类实现抽象类AbstractProcessor,覆写process方法
@SupportedAnnotationTypes("com.thor.lib_annotations.ThorAnno")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class ThorProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
return false;
}
}
2.2、注册
方式一:在main文件夹下新建 resource/META-INF/services/javax.annotation.processing.Processor 如图
方式二 :谷歌提供了导入包的方式
在build.gradle下的dependencies下
compileOnly'com.google.auto.service:auto-service:1.0-rc4'
annotationProcessor'com.google.auto.service:auto-service:1.0-rc4'
3、使用在app的build.gradle加入引用annotations工程和注解解析器工程
implementation project(path: ':lib_annotations')
annotationProcessor project(path: ':lib_compiler')
三、相关类解析
1、AbstractProcessor
- init(ProcessingEnvironment processingEnvironment)
用于初始化一些参数,参数是ProcessingEnvironment类型
- getSupportedSourceVersion() 获取java支持的版本
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
简便写法:在注解类上添加注解SupportedSourceVersion
- getSupportedAnnotationTypes() 获取该注解解析器关注的注解
@Override
public Set<String> getSupportedAnnotationTypes() {
HashSet set=new HashSet();
set.add(ThorAnno.class.getCanonicalName());
return set;
}
简便写法:在注解类上添加注解SupportedAnnotationTypes
- process(Set<? extends TypeElement> set,RoundEnvironment roundEnvironment) 用于处理注解
2、ProcessingEnvironment
Messager getMessager(); //用于打印日志
Filer getFiler(); //用于文件写入
Elements getElementUtils(); // 操作Element的工具类(类,函数,属性,其实都是Element)
Types getTypeUtils(); //type(类信息)的工具类,包含用于操作TypeMirror的工具方法
四、代码
1、获取options
@SupportedAnnotationTypes("com.thor.lib_annotations.ThorAnno")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedOptions("options_value")
public class ThorProcessor extends AbstractProcessor {
private Messager mMessager;
private String options;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
mMessager = processingEnvironment.getMessager();
mMessager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>>>>>>>>>> 初始化");
options = processingEnvironment.getOptions().get("options_value");
}
传递options的值 在app的build.gradle的 le的 defaultConfig节点下
javaCompileOptions {
annotationProcessorOptions {
arguments = [options_value: “111”]
}
}
2、获取被注解的元素
// 获取所有被 @ARouter 注解的 元素集合
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ThorAnno.class);
for (Element element : elements) {
// 获取类节点,获取包节点 (com.xiangxue.xxxxxx)
String packageName = elementTool.getPackageOf(element).getQualifiedName().toString();
// 获取简单类名,例如:MainActivity
String className = element.getSimpleName().toString();
//获取注解的值
ThorAnno annotation = element.getAnnotation(ThorAnno.class);
String value = annotation.value();
}