当前播放: 如何快速构建Java注解处理器?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
合辑:新版短视频
Android中如何绘制特殊效果?
React Native中的导航是如何实现的?
如何设计和实现分布式环境下的全局唯一性ID?
目标检测(object detection)发展的关键路径:R-CNN
在Android中如何自定义View控件?
音视频处理,有哪些AI算法是你必须知道的?
ThreadLocal原理分析及内存泄漏演示
如何用好Redis内存数据库?
大型电商如何做双11/618的稳定性保障?
程序员怎么利用副业赚钱?
亿级平台HBase集群到底如何配置?
在自动化测试过程中如何搭建Mock Server?
自动化测试中,如何融合API测试和UI测试?
流控算法哪家强?
怎样做好一个开源项目?
活用工具解决网络问题
HTTP协议的性能测试脚本,到底该怎么写?
Go语言依赖管理Go Module的正确使用姿势
如何快速构建Java注解处理器?
网络传输中为什么需要压缩视频?
互联网大厂如何玩转代码评审?
负载均衡除了算法策略,你还应该知道哪些?
怎样利用线上日志排查问题?
如何从蛛丝马迹中分析系统间调用出现的问题?
如何做好容量评估?
如何通过反垃圾邮件引擎来理解机器学习?
微服务的SLA服务可用性等于4个9,我是怎么做到的?
影响性能的关键环节和性能指标有哪些?
文件资源是如何影响到网站性能的?
创业案例分享:从冷启动到实现百万营收都要做哪些事情?
新入行的测试工程师,如何进阶为测试专家?
如何高效地实施 CSS 方法论中的BEM?
利用FP、FMP和FCP如何评估应用首屏性能?
如何基于可靠事件模式实现数据最终一致性?
Server与Web常用的功能自动化测试框架该如何选择?
Target事件中体现了哪些数据道德与法律问题?
彻底掌握JVM内存设置的金钥匙
如何基于微内核架构解决系统扩展性问题?
到底什么是列式存储?它凭啥速度飞快?
如何有效识别和解决代码中存在的循环依赖问题?
11分钟搞定JVM的双亲委派机制
如何搭建一套前端监控系统?
如何实现Flutter自动化埋点?
如何使用JMeter设计混合交易容量场景?
如何使用可编程前置处理器开发JMeter脚本?
论全链路压测的手段与技巧
如何编写出优雅的Go程序?
Go语言开发中的常见陷阱与规避方法
支付中台对账中心如何建设?
一个基本的支付系统由哪些部分组成?

如何快速构建Java注解处理器?

赵立飞 某电商公司Android资深工程师

大家知道,Java 的注解系统是非常强大的。除了最常见的 Override、Deprecated 注解以外,我们还会看到很多项目里都会用到注解,注解的应用大大简化了大家的开发。可以说,在注解体系中,注解处理器扮演着非常重要的角色。Java 的注解处理工具 APT 是一种轻量高效的代码预处理工具,应用在许多项目中。今天主要讲如何快速构建注解处理器,解读官方文档中比较难懂的几个点,让大家有个深入的理解。

附录:
1、注解处理器 Process 接口内部的其他几个方法。getSupportedOptions(),这个是配置注解处理器支持的 options。

public Set<String> getSupportedOptions()
复制代码

getSupportedSourceVersion(),这个方法配置注解处理器支持的源码版本。

public SourceVersion getSupportedSourceVersion()
复制代码

2、ProcessingEnvironment 内部提供的几个接口对象

Filer 接口是用来操作文件的,Elements 接口是用来处理元素的,Types 接口用来处理类型。Messager 接口用来输出各类日志。

很多情况下,我们为了后面使用方便,我们会把这些实例保存在 Processor 内部,供后面使用。但是,AbstractProcessor 已经为我们做好了这些,在 AbstractProcessor 里面,有一个成员变量 processingEnv。在后面的处理中,我们可以直接使用这个变量获取各个实例。

protected ProcessingEnvironment	processingEnv;
复制代码

3、getSupportedOptions 用法

getSupportedOptions 告诉 APT 我们的注解处理器能够接受哪些 Options。那这个方法可以怎么用呢?

很多时候,我们工程里需要一些动态配置,这些配置是不可以在工程里写死的,需要使用者在调用的时候传入,通常都是命令行传入。这里的 Options,其实就是对应命令行的各个参数。

如果我们的注解处理器支持一些动态功能,那就可以让用户通过 Options,也就是命令行参数传给我们。Options 在命令行里的输入格式是 -Akey=value。

现在举个例子。假设我们提供一个 Option,这个 Option 的 key 是 ignore,用户通过这个参数传给我们一个全类名列表,我们拿到这个列表,解析这些类名,在注解处理的时候忽略这些类。这个时候,我们就需要重写 getSupportedOptions 这个方法。

public Set<String> getSupportedOptions() {
    Set<String> set = new HashSet<>();
    set.add("ignore");
    return set;
}
复制代码

用户的命令行参数就可以写成

-Aignore='com.example.A;com.example.B'
复制代码

APT 在注解处理的时候,就会将这个参数的 key、value 传入。我们通过 processingEnv.getOptions().get(“ignore”) 便可以获取这个 value。

String ignoredClasses = processingEnv.getOptions().get("ignore");
复制代码

讲师介绍

赵立飞,Android 资深工程师。曾在奇虎 360、饿了么、爱奇艺等公司,担任工程师或技术专家,目前就职于某电商公司。精通 Java 底层技术,研发方向包括 Android Framework 和 Linux 系统。

展开
¥4.99 购买
开通VIP
58
登录 后留言

精选留言(2)

  • 慌张而黑糖
    涨知识了,不知道spring框架的注解是基于反射,还是说是用注解处理器实现的
    2020-06-28
    2
    4
  • Es muss sein.
    老师可以说说,一般在什么场景下建议使用APT吗,是不是在拿元信息的地方都可以去替代反射呢
    2020-07-30
收起评论
其他推荐
10:00
binlog数据恢复有哪几种方法?
李金鹏 北汽新能源数据库负责人
试看
04:00
为什么说Java仍将是未来的主导语言?
Rishav Kaundal
免费
14:34
在Java中如何写一个正确的单例模式?
徐隆曦 滴滴出行高级工程师
试看