APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解。注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。
简单来说就是在编译期,通过注解生成.java文件。
运行时注解(@Retention(RetentionPolicy.RUNTIME)):之前讲得运行时注解,是在程序运行的时候,获取和解析注解的,并且在获取一些信息后通过反射达到效果。运行时注解的例子。
编译时注解(@Retention(RetentionPolicy.CLASS)):编译时注解在编译的时候需要用到代理模式,生成对应java文件,在程序运行的时候,使用该java文件,并调用方法来达到预期的效果。
下面来一步步实现APT:
1.创建注解类:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {
int value();
}
2.创建AbstractProcessor实现类:
@AutoService(Processor.class)
public class BindViewProcessor extends AbstractProcessor {
private Messager mMessager;
private Elements mElementUtils;
private Map<String, ClassCreatorProxy> mProxyMap = new HashMap<>();
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
mMessager = processingEnv.getMessager();
mElementUtils = processingEnv.getElementUtils();
}
@Override
public Set<String> getSupportedAnnotationTypes() {
HashSet<String> supportTypes = new LinkedHashSet<>();
/*** 这里是将使用到的注解类加入到集合中 ***/
supportTypes.add(BindView.class.getCanonicalName());
return supportTypes;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
/*** 这里主要是生成需要的Java文件,因此这里是关键的地方 ***/
...
return true;
}
其中的init、 getSupportedAnnotationTypes、getSupportedSourceVersion三个方法的写法是固定的,关键的地方是process方法,这里需要用来创建Java类文件,可以使用比较好用的第三方库:JavaPoet。
那么AbstractProcessor实现类的方法什么时候执行呢?这个时候需要运用到SPI技术。注意到BindViewProcessor类上面有一个注解@AutoService(Processor.class),这个是google的第三方库,需要在gradle里面引用:
implementation 'com.google.auto.service:auto-service:1.0-rc2'
但是有时候这种方法不生效,原因我也不是很清楚。。。
因此最稳的方法就是自己手动创建相关文件夹:

其中javax.annotation.processing.Processor里面的内容是AbstractProcessor实现类:BindViewProcessor类的路径:
com.zy.apt_processor.BindViewProcessor
来源:https://blog.csdn.net/u012588160/article/details/98766495