Android编译时注解——APT技术

大憨熊 提交于 2019-11-26 08:23:20

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!