Android 中使用 APT

APT(Annotation Processing Tool)注解处理器,是一种处理注解的工具。
APT 在编译时期扫描源代码中的注解,开发中根据注解,利用 APT 自动生成 Java 代码,减少冗余代码和手动的代码输入,提高编码效率。

APT 中的数据类型和概念

1. ProcessingEnvironment

在复写 AbstractProcessor 的 init 方法时,参数就是一个 ProcessingEnvironment 对象。它内部提供一下实用对象,我们可以利用这些对象,来实现需要的功能。

@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
   
    super.init(processingEnvironment);
    ...
}
2. Element

在 APT 阶段,任何事物都被成为元素。比如一个对象、一个类、一个方法、一个参数,它们都被统一称为元素。 Element 是个接口类,有很多子类。子类在其基础上增加了额外的接口方法来描述具体事物的特殊属性。

  • TypeElement: 一个类或接口程序元素

  • VariableElement: 一个字段、 enum 常量、方法或构造方法参数、局部变量或异常参数

  • ExecutableElement: 某个类或接口的方法、构造方法或初始化程序(静态或实例),包括注解类型元素

  • PackageElement: 一个包程序元素

  • TypeParameterElement: 一般类、接口、方法或构造方法元素的泛型参数

2.ElementKind

是一个枚举类,用于判断元素;
包含 PACKAGE(包),CLASS(类),INTERFACE(接口),FIELD(变量),PARAMETER(参数),METHOD(方法)

3.Elements

处理 Element 对象的工具类

4. Filer

Filer 是一个文件操作的接口,可以创建或写入一个 Java 文件。和一般的文件区别在于它是专门处理 Java 文件,以 .java 或 .class 为后缀的文件。在 APT 中,在自动代码生成后,用 Filer 生成一个 .java 或 .class 文件。

5. Types

是一个操作类型的工具类,也可以操作 TypeMirror 对象。
例如如果想知道变量的类型,可以通过 Types 相关类处理。

// 判断是否为 Parcelable 类型
String PARCELABLE = "android.os.Parcelable"
TypeMirror  parcelableType = elements.getTypeElement(PARCELABLE).asType();
if (types.isSubtype(typeMirror, parcelableType)) {
   
    // PARCELABLE
    return TypeKind.PARCELABLE.ordinal();
}
6. TypeMirror

表示数据类型,包含基本类型 int、 boolean,也包含复杂类型,例如 自定义类、数组、Parcelable 等

7. Modifier

修饰词。有 PUBLIC, PROTECTED, PRIVATE, ABSTRACT, DEFAULT等

8. RoundEnvironment

复写 AbstractProcessor 的 process 方法,其中一个参数就是 RoundEnvironment。 可以通过 RoundEnvironment 对象获取在代码中设置的相关注解的 Element

ARouter 中的代码生成

开源库 ARouter 是一个广泛应用的路由,它也是使用 APT 方式,生成相应的代码。
在使用 APT 生成代码使用了 JavaPoet , JavaPoet 使用比较简单,根据官方文档直接去操作即可。至于如何使用 JavaPoet ,请参考我之前的文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值