android APT 使用
时间:2022-07-22
本文章向大家介绍android APT 使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是 APT
APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具.简单来说就是在编译期,根据代码中的注解依据相应的规则生成.java文件.
使用
1.创建 自定义注解
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface JetInject {
String value() default "";
}
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface IRouter {
/**
* 该参数当前仅仅支持在activity中使用,表示路由列表
* @return
*/
String[] value() default {};
}
2.创建 java-library类型的 module 作为 compiler
- 自定义 AbstractProcessor,并且用@AutoService注解标记AutoService会自动在META-INF文件夹下生成Processor配置信息文件,该文件里就是注解处理器的全称
com.xxx.appcompiler.compiler.Compiler
自动生成如下文件
app.compiler/build/classes/java/main/META-INF/services/javax.annotation.processing.Processor
//javax.annotation.processing.Processor 内容如下:
com.xxx.appcompiler.compiler.Compiler
如果不使用 Google 的
com.google.auto.service:auto-service
这个库,则需要写如下代码:
1.需要在 processors 库的 main 目录下新建 resources 资源文件夹
2.在 resources文件夹下建立 META-INF/services 目录文件夹
3.在 META-INF/services 目录文件夹下创建 javax.annotation.processing.Processor 文件
4.在 javax.annotation.processing.Processor 文件写入注解处理器的全称,包括包路径
com.xxx.appcompiler.compiler.Compiler
- Compiler类内容
@AutoService(Processor.class)
public class Compiler extends AbstractProcessor {
//process方法会执行多次 这个 flag 用来 保证执行一次
private boolean isFirst;
@Override
public Set<String> getSupportedAnnotationTypes() {
//将我们自定义的注解添加Set集合
Set<String> types = new LinkedHashSet<>();
types.add(JetInject.class.getCanonicalName());
types.add(IRouter.class.getCanonicalName());
types.add(JetInit.class.getCanonicalName());
return types;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
ProcessingManager manager = ProcessingManager.get();
manager.setElementUtils(processingEnv.getElementUtils());
manager.setFiler(processingEnv.getFiler());
manager.setMessager(processingEnv.getMessager());
manager.setTypeUtils(processingEnv.getTypeUtils());
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {
if (isFirst) {
return false;
}
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "---------jet begin --------------------");
isFirst = true;
EleParser.getInstance().initPreCode();
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(JetInject.class);
Set<? extends Element> routers = roundEnv.getElementsAnnotatedWith(IRouter.class);
if (!init(roundEnv)) {
return true;
}
for (Element ele : elements) {
if (ele.getKind() == ElementKind.FIELD) {
EleParser.getInstance().parser(processingEnv, ele, false, true);
} else if (ele.getKind() == ElementKind.CLASS) {
EleParser.getInstance().parser(processingEnv, ele, true, true);
}
}
for (Element ele : routers) {
if (ele.getKind() == ElementKind.CLASS) {
EleParser.getInstance().parser(processingEnv, ele, true, false);
}
}
//使用javapoet生成代码
EleParser.getInstance().build();
return true;
}
}
生成的代码路径
app/build/generated/source/apt/debug/com/xxx/androidcompileractivity/JetInitializer.java
更多内容 欢迎关注公众号
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SVN提交时强制用户写日志
- Apache vhost配置
- win10使用WSL 2运行Docker Desktop,运行文件从C盘迁移到其他目录
- htaccess简介和16个小技巧
- Nginx禁止指定目录运行PHP脚本
- 机器学习数学笔记|偏度与峰度及其 python 实现
- ABP(ASP.NET Boilerplate Project)快速入门
- IdentityServer4 4.x版本 配置Scope的正确姿势
- 个人总结的部分数据验证规则
- 一句话实现php日期转中文汉字
- .Net Core微服务入门全纪录(八)——Docker Compose与容器网络
- PHP中少用但是很好用的方法
- 使用一维数据构造简单卷积神经网络
- .Net Core微服务入门全纪录(完结)——Ocelot与Swagger
- PHP使用GD库生成文件