前言
APT的学习要花点时间去掌握和实践的,短时间内只能掌握知识点,更多的是在实战中去实践。其实,APT就是一种工具而已,只要用多了,自然就会熟练了,不过要想实践之前,还是必须把基础知识学好才能实战进入开发。文章会从基础用例讲解知识点,然后再通过实战进行实践
APT简介
APT(Annotation Processing Tool)是一种处理注解的工具,它会对源代码中的注解进行额外的处理,比如在编译时生成一些重复性操作的Java代码,或者不需要程序员去关心的Java代码等。
在使用APT的过程中会涉及到下面两个第三方库的使用
- AutoService:这个库的主要作用是注册注解,并对其生成META-INF的配置信息
- JavaPoet:这个库的主要作用是帮助我们通过类调用的形式来生成Java代码
APT主要过程包括初始化过程和注解处理过程
- 初始化过程:获取APT提供的工具类,为后面的注解处理提供帮助
- 注解处理过程:获取注解的元素,对元素进行额外处理,可用JavaPoet生成Java代码
APT流程
1、定义注解
该注解是可以在我们的项目中使用到的,且规定为注解元素的类型为Type,和在编译时生效
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ModuleWrapper {
}
2、定义Processor
Processor会在编译期对注解进行解析,取出对应的元素进行处理。至于AutoService则是固定的写法,加个注解即可
@AutoService(Processor.class)
public class ModuleProcessor extends AbstractProcessor {
private Filer filerUtils; // 文件写入
private Elements elementUtils; // 操作Element工具类
private Messager messagerUtils; // Log 日志
private Map<String, String> options; // 额外配置参数
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
filerUtils = processingEnvironment.getFiler();
elementUtils = processingEnvironment.getElementUtils();
messagerUtils = processingEnvironment.getMessager();
options = processingEnvironment.getOptions();
}
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> types = new LinkedHashSet<>();
types.add(ModuleWrapper.class.getCanonicalName());
return types;
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
initModuleMap(roundEnvironment);
return false;
}
private void initModuleMap(RoundEnvironment roundEnv) {
//获取对应的注解元素
Set<? extends Element> set = roundEnv.getElementsAnnotatedWith(ModuleWrapper.class);
for (Element element : set) {
//如果是个类
if (element.getKind() == ElementKind.CLASS) {
//获取类名
String clzName = element.getSimpleName().toString();
//对元素进行处理,可用javapoet生成Java代码
......
} else {
messagerUtils.printMessage(Diagnostic.Kind.NOTE, "only support class");
}
}
}
}
3、AbstractProcessor实现方法介绍
- init():初始化过程,可通过初始化方法获取各种工具类
- process():注解处理过程,可通过获取注解元素后,对注解元素进行额外处理
- getSupportedAnnotationTypes():获取需要解析的注解类型
APT知识点
1、初始化介绍
APT初始化阶段为init方法的调用,我们可以使用ProcessingEnvironment获取一些实用类以及获取选项参数等