大家知道,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 系统。