Android 组件化实战一: Gradle基础语法
Android 组件化实战二: 项目部署
Android组件化实战三: 模块之间的交互
Android组件化实战四: APT的介绍与使用
Android组件化实战五: APT的高级用法JavaPoet
Android组件化实战六:路由架构设计
前言
上一篇文章分析了组件化模块交互的两种实现方式,对于全局Map保存目标Activity的路径信息和类对象方案,如果Activity的数量繁多,则需要在主模块app的application中重复执行多次保存操作,既不优雅,又不符合实际开发场景,我们想到的解决之一就是想办法生成一个来完成这个重复枯燥的任务,生成一个类来帮我们找到跳转目标Activity的class对象。好比Butterknife生成一个文件专门完成findViewById的操作一样。这就涉及到注解处理器即apt技术,接下来就了解apt的使用和原理吧
什么是APT
APT全称为Annotation Processing Tool ,翻译过来就是注解处理器,是一种处理注释/注解的工具,它对源代码文件中进行检测找出其中的Annotation,根据注解自动生成代码,如果想要自定义的注解处理器能够正常运行,必须要通过APT工具来进行处理,也可以这样理解,只有通过声明APT工具后,程序在编译期间自定义的注解解释器才能执行。
通俗理解:根据规则,帮我们生成代码、生成类文件
结构体语言
如果对HTML有所了解,就知道它是又element组成的结构体
<html>
<body>
<div>
...
</div>
</body>
</html>
而对于java源文件来说,它同样是一种结构体语言,我们不可能把类名写在包名之上,也不可能把属性写在类名之上,这是规则,包名、类名、成员属性、成员方法,与之相对应的就是程序元素/节点
package com.example.modular_apt; // PackageElement 包元素/节点
public class User {
// TypeElement类元素/节点
private String name; // VariableElement属性元素/节点
public User() {
// ExecutableElement方法元素/节点
}
private void setName(String name) {
this.name = name;
}
}
Element程序元素
- PackageElement: 表示一个包程序元素。提供对有关包及其成员的信息的访问
- TypeElement: 表示一个类或接口程序元素。提供对有关类型及其成员的信息的访问
- VariableElement: 表示一个字段、enum常量、方法或构造方法参数、局部变量或异常参数
- ExecutableElement: 表示某个类或接口的方法、构造方法或初始化程序(静态或实例)
需要掌握的API
创建工程实战
构建app module, 在该module中有MainActivity、OrderActivity、PersonalActivity三个Activity,通过apt技术即注解处理器,根据对应的注解,生成类文件,获取对应Activity的class对象。这样即使在不同的模块,只要拿到了目标Activity的class对象,就可以进行跳转了。
构建java library annotation 在该java库中有一个类注解ARouter,注解处理器库就是根据这个注解的参数,获取类名。
@Target(ElementType.TYPE) // 该注解作用在类之上
@Retention(RetentionPolicy.CLASS) // 要在编译时进行一些预处理操作。注解会在class文件中存在
public @interface ARouter {
// 详细路由路径(必填),如:"/app/MainActivity"
String path();
// 路由组名(选填,如果开发者不填写,可以从path中截取出来)
String group() default