目录
一、概念
就是java代码在编译时,就解析相关的注解。所以其对运行时效率极高,因为注解在编译时就解析完毕了。
相关资料:
https://blog.csdn.net/fengxingzhe001/article/details/78520298
https://blog.csdn.net/hongxue8888/article/details/97228827
https://www.jianshu.com/p/7e201f3fbb84
https://www.sohu.com/a/190297582_611601
https://blog.csdn.net/xiayong1/article/details/85854725
https://xujiajia.blog.csdn.net/article/details/105027291
https://my.oschina.net/u/1177694/blog/3018281
https://blog.csdn.net/qq_20521573/article/details/82321755
二、集成步骤
1.新建java-library
注意工程一定是java工程,不是android工程。否则无法导入AbstractProcessor这个类。
且java-library无法引用android-library及以及某些android库,这个一定要注意。
2.引用库
dependencies {
//autoservice用来自动生成META-INFO文件,注册注解解析器。
implementation 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
// 帮助我们通过类调用的方式来生成java代码
implementation 'com.squareup:javapoet:1.11.1'
}
三、新建自定义注解解析器类
1.新建类并继承AbstractProcessor
2.为自定义类加上@AutoService(Processor.class)
@AutoService(Processor.class)
public class LyRouteProcessor extends AbstractProcessor {
...
}
AutoService是google开发一个注解,作用是为注解解析器类自动生成jar包里的配置文件。

3.复写AbstractProcessor的几个配置方法
下面的几个方法都有相对应的注解类,直接在自定义类上注解。采用方法复写,更便于继承。
1)getSupportedOptions
@Override
public Set getSupportedOptions() {
return ImmutableSet.of(ProcessorConfig.OPTION_MODULE_NAME,
ProcessorConfig.OPTION_MODULE_DEBUG
);
}
用于接收gradle的配置参数,参数的类型都只能是String类型。
对应gradle的配置参数如下:
android {
...
defaultConfig {
...
//将module的名称传递给路由框架
javaCompileOptions {
annotationProcessorOptions {
arguments = [
moduleName: project.getName(),
debug : "t"
]
}
}
}
...
}
2)getSupportedSourceVersion
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
3)getSupportedAnnotationTypes
@Override
public Set getSupportedAnnotationTypes() {
return ImmutableSet.of(LyRoute.class.getName());
}
指定自定义注解解析器所支持的注解类型,只有这里返回的注解类型才可被扫描到。
4.复写AbstractProcessor的init方法
可以在此处获得一些工具类如Filer、Messager,获取gradle的option参数。
5.复写AbstractProcessor的process方法
这个是自定义注解解析器的核心方法,也是业务实现的地方。
1)通过下面的方法,获取注解元素的集合。
Set elements = roundEnvironment.getElementsAnnotatedWith(LyRoute.class);
2)遍历注解元素集合,通过poet技术生成模板文件。
对于简单的类生成可以不采用poet,直接使用字符串替换,具体可参考Tinker源码中关于DefaultLifeCycle注解的处理。
四、常用操作
1.判断类型
先获取待判断的两个类型的TypeMirror,再通过Types类的isSubtype方法判断两个TypeMirror的子属关系。
通过全类名获取TypeMirror的方法
Elements.getTypeElement(全类名);
五、调试
https://blog.csdn.net/zhangteng22/article/details/54946270
1.在gradle.properties中加入以下参数
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8013
2. 在Android Studio建立Remote Debugger。
3.终端输入 gradlew --daemon
4.打好断点,执行 Remote Debugger。
5.执行 gradlew clean assembleDebug 或者rebuild
0 条评论