赞
踩
一、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
用于初始化一些参数,参数是ProcessingEnvironment类型
- @Override
- public SourceVersion getSupportedSourceVersion() {
- return SourceVersion.latestSupported();
- }
简便写法:在注解类上添加注解SupportedSourceVersion
- @Override
- public Set<String> getSupportedAnnotationTypes() {
- HashSet set=new HashSet();
- set.add(ThorAnno.class.getCanonicalName());
- return set;
- }
简便写法:在注解类上添加注解SupportedAnnotationTypes
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();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。