android-apt如何使用
前言
APT的概念大家应该不会陌生, 而且在很多第三方库中都有使用到, 最有名的应该就是ButterKnife了. 这里基础概念就略过了, 本篇主要是着重在怎么编写自己的注解处理器, 以及一些踩到的坑.
开始
一般要实现编译器注解处理生成, 需要新建两个module, 分别存放自定义的Annotation和对应Annotation的处理器.
自定义注解
我们先新建存在自定义注解的module, 注意, 这里建议新建java-library, 便于本地调试时给存放处理器的module依赖使用, 对应gradle配置如下
自定义一个新的注解
这里Retention注解表示设置注解保留时机, 需要传递的是RetentionPolicy枚举类型, 值分别有:
SOURCE: 编译器时就会抛弃注解
CLASS: 注解保留到编译器, 运行期会去除
RUNTIME: 注解保留到运行期, 编译器时也会存在
Target表示注解适用的上下文, 即他的目标修饰类型, 可以传数组,值应该为ElementType,枚举各个值的含义可以看官方文档, 我们主要用到比较多的应该是
TYPE: 类, 接口(包括注解类型)或者枚举的声明
METHOD: 方法声明
FIELD: 字段声明, 包括枚举常量
LOCAL_VARIABLE: 局部变量声明
CONSTRUCTOR: 构造函数的声明
注解处理器
同样需要新建一个java-library, 对应gradle的配置如下
然后开始编写处理器, 关于如何使用JavaPoet, 建议看下官方文档, 在这里不再细说.最后通过Filer来进行文件的写入.
错误信息
由于注解处理器是JVM在编译期进行运行, 所以普通的Log无法用来提示我们来打印一些日志或者用来提示错误信息.在Processor中, 当执行初始化的时候, 会传进来一个ProcessingEnvironment参数, 在上方代码注释内我也写了, 他会提供一些我们需要的参数, 比如Messager一个用来报告错误, 警报或者其他通知的工具, 它可以用来提醒第三方使用注解的开发者们来处理相关的错误.它有多个重载函数, 用于设置提醒到哪个地步, 具体可以自己尝试下.
使用自定义注解
当我们需要使用的时候, 那么就跟常见的几个第三方库的使用(比如Dagger之类)是一样的.
值得注意的是如果你使用的是kotlin开发使用到对应的注解, 那么首先需要依赖kapt插件, 然后以kapt替换annotationProcessor添加注解处理库, 当项目里有Java文件使用到注解的时候,kapt也会兼顾到.
Tips
我们在开始的时候, 谈到注解的声明和处理器需要分别放在不同的module里, 原因是因为, 如果放在一个module里, 那么应用项目在依赖的时候, 就会变成
而不论是我们使用的AbstractProcessor还是JavaPoet库, 都是依赖于JDK进行编译的, 当应用项目依赖于(implementation)这个库的时候, AS就会默认用SDK来进行编译, 导致编译器提示部分类无法加载, 所以我们才需要分成两个module, 保证到进行逻辑处理的处理器可以不会通过implementation被依赖进项目中.相关可以看看相关的issue的说明。
干货分享未完待续,小编将持续更新,小伙伴们也可以看看我其他作品。喜欢的记得点赞支持哦!