Android进阶——Java注解实战之APT构建模块化的第一步

本文介绍了Android中APT(Annotation Processing Tool)的使用,包括APT的简介、流程、核心知识点以及实战应用,旨在帮助开发者理解如何利用APT进行模块化构建。通过定义注解、创建Processor、使用JavaPoet生成代码,实现编译时自动化处理。
摘要由CSDN通过智能技术生成

前言

APT的学习要花点时间去掌握和实践的,短时间内只能掌握知识点,更多的是在实战中去实践。其实,APT就是一种工具而已,只要用多了,自然就会熟练了,不过要想实践之前,还是必须把基础知识学好才能实战进入开发。文章会从基础用例讲解知识点,然后再通过实战进行实践

APT简介

APT(Annotation Processing Tool)是一种处理注解的工具,它会对源代码中的注解进行额外的处理,比如在编译时生成一些重复性操作的Java代码,或者不需要程序员去关心的Java代码等。
在使用APT的过程中会涉及到下面两个第三方库的使用

  1. AutoService:这个库的主要作用是注册注解,并对其生成META-INF的配置信息
  2. JavaPoet:这个库的主要作用是帮助我们通过类调用的形式来生成Java代码

APT主要过程包括初始化过程和注解处理过程

  1. 初始化过程:获取APT提供的工具类,为后面的注解处理提供帮助
  2. 注解处理过程:获取注解的元素,对元素进行额外处理,可用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实现方法介绍

  1. init():初始化过程,可通过初始化方法获取各种工具类
  2. process():注解处理过程,可通过获取注解元素后,对注解元素进行额外处理
  3. getSupportedAnnotationTypes():获取需要解析的注解类型

APT知识点

1、初始化介绍

APT初始化阶段为init方法的调用,我们可以使用ProcessingEnvironment获取一些实用类以及获取选项参数等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值