@target 多个值无法使用_android-apt如何使用

c1b9140803fa998b570a8e1218b46b7f.png

前言

APT的概念大家应该不会陌生, 而且在很多第三方库中都有使用到, 最有名的应该就是ButterKnife了. 这里基础概念就略过了, 本篇主要是着重在怎么编写自己的注解处理器, 以及一些踩到的坑.

73606da702f92578c7fdf71042587389.png

开始

一般要实现编译器注解处理生成, 需要新建两个module, 分别存放自定义的Annotation和对应Annotation的处理器.

自定义注解

我们先新建存在自定义注解的module, 注意, 这里建议新建java-library, 便于本地调试时给存放处理器的module依赖使用, 对应gradle配置如下

3ad1044c7852e161b3bfd36c6d7e80de.png

自定义一个新的注解

7e21b9113da059cd1b5e57a1e69f6f44.png
  1. 这里Retention注解表示设置注解保留时机, 需要传递的是RetentionPolicy枚举类型, 值分别有:
  • SOURCE: 编译器时就会抛弃注解
  • CLASS: 注解保留到编译器, 运行期会去除
  • RUNTIME: 注解保留到运行期, 编译器时也会存在
  1. Target表示注解适用的上下文, 即他的目标修饰类型, 可以传数组,值应该为ElementType,枚举各个值的含义可以看官方文档, 我们主要用到比较多的应该是
  • TYPE: 类, 接口(包括注解类型)或者枚举的声明
  • METHOD: 方法声明
  • FIELD: 字段声明, 包括枚举常量
  • LOCAL_VARIABLE: 局部变量声明
  • CONSTRUCTOR: 构造函数的声明

注解处理器

同样需要新建一个java-library, 对应gradle的配置如下

41deb5c559043a3accf6a0f5ae450bbe.png

然后开始编写处理器, 关于如何使用JavaPoet, 建议看下官方文档, 在这里不再细说.最后通过Filer来进行文件的写入.

fce595c7d14c7ef7a9eda3f4d2cd4293.png

错误信息

由于注解处理器是JVM在编译期进行运行, 所以普通的Log无法用来提示我们来打印一些日志或者用来提示错误信息.在Processor中, 当执行初始化的时候, 会传进来一个ProcessingEnvironment参数, 在上方代码注释内我也写了, 他会提供一些我们需要的参数, 比如Messager一个用来报告错误, 警报或者其他通知的工具, 它可以用来提醒第三方使用注解的开发者们来处理相关的错误.它有多个重载函数, 用于设置提醒到哪个地步, 具体可以自己尝试下.

a83941b26ec0b9d64a523c5daf9b7363.png

使用自定义注解

当我们需要使用的时候, 那么就跟常见的几个第三方库的使用(比如Dagger之类)是一样的.

e3eb8b9d2a54cb17f34cc1809aae502a.png

值得注意的是如果你使用的是kotlin开发使用到对应的注解, 那么首先需要依赖kapt插件, 然后以kapt替换annotationProcessor添加注解处理库, 当项目里有Java文件使用到注解的时候,kapt也会兼顾到.

7c46ce6767ea481d75e905920904e2fa.png

Tips

我们在开始的时候, 谈到注解的声明和处理器需要分别放在不同的module里, 原因是因为, 如果放在一个module里, 那么应用项目在依赖的时候, 就会变成

9e6788b92045934631d3d8fadfbaa012.png

而不论是我们使用的AbstractProcessor还是JavaPoet库, 都是依赖于JDK进行编译的, 当应用项目依赖于(implementation)这个库的时候, AS就会默认用SDK来进行编译, 导致编译器提示部分类无法加载, 所以我们才需要分成两个module, 保证到进行逻辑处理的处理器可以不会通过implementation被依赖进项目中.相关可以看看相关的issue的说明。

干货分享未完待续,小编将持续更新,小伙伴们也可以看看我其他作品。喜欢的记得点赞支持哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值