Android组件化一文教你玩转APT

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android组件化一文教你玩转APT相关的知识,希望对你有一定的参考价值。

APT(Annotation Processing Tool)


javaPoet是什么?


实战项目结构


注解的定义 


package com.wust.arouter_annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * ClassName: ARouter <br/>
 * Description: <br/>
 * date: 2022/2/10 15:13<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */

@Target(ElementType.TYPE) // 类上面
@Retention(RetentionPolicy.CLASS) // 编译期
public @interface ARouter 

    String path();

    String group() default "";

注解处理器 依赖配置 的添加


  • 配置文件的编写 
plugins 
    id 'java-library'


dependencies 
    implementation fileTree(dir: 'libs', includes: ['*.jar'])

    //背后的服务 --> 帮我们自动监视代码的编译
    compileOnly 'com.google.auto.service:auto-service:1.0-rc3'
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'

    //帮助我们通过类调用的形式来生成Java代码【javaPoet】
    implementation 'com.squareup:javapoet:1.9.0'

    //依赖注解
    implementation project(":arouter-annotations")


java 
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
  • 配置文件编写位置

app项目依赖注解配置并使用 


  • app项目依赖 注解模块 配置的添加 

  •  app项目使用 注解模块 定义的注解
package com.wust.newmodueljavapoet;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.Nullable;

import com.wust.arouter_annotations.ARouter;

/**
 * ClassName: MainActivity <br/>
 * Description: <br/>
 * date: 2022/2/10 16:14<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */

@ARouter(path = "MainActivity")
public class MainActivity extends Activity 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

注解处理器类处理方法的完善


package com.wust.compiler;

import com.google.auto.service.AutoService;

import java.io.File;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

/**
 * ClassName: ARouterProcessor <br/>
 * Description: <br/>
 * date: 2022/2/10 16:20<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */

@AutoService(Processor.class) //启用服务 ,看清楚,别选择成了 Process.class,否则你死活看不到执行这个注解处理器
@SupportedSourceVersion(SourceVersion.RELEASE_7) //环境的配置
@SupportedAnnotationTypes("com.wust.arouter_annotations.ARouter") //明确这个注解处理器 处理 哪个注解
public class ARouterProcessor extends AbstractProcessor 

    //操作 Element 的工具类(类,函数,属性,其实都是Element)
    private Elements elementTool;

    //type(类信息)的工具类,包含用于操作TypeMirror的工具方法
    private Types typeTool;

    //Message用来打印 日志相关信息
    private Messager messager;

    //文件生成器,类 资源 等,就是最终要生成的文件 是需要Filer来完成的
    private Filer filer;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) 
        super.init(processingEnv);

        //初始化
        elementTool = processingEnv.getElementUtils();
        messager = processingEnv.getMessager();
        filer = processingEnv.getFiler();
    

    //在编译的时候干活
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) 
        return false;
    

注解处理器如何拿到Android代码


总体思路:只有通过 gradle 来实现

  • app项目下的build.gradle中进行配置
        //传递参数
        javaCompileOptions 
            annotationProcessorOptions 
                arguments = [MyName: 'yiqi']
            
        

//依赖注解处理器 注解处理器才能工作
annotationProcessor project(":compiler")

  • 接收参数 
···省略···

/**
 * ClassName: ARouterProcessor <br/>
 * Description: <br/>
 * date: 2022/2/10 16:20<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */

//接收 安卓工程传递过来的参数
@SupportedOptions("MyName")

···省略···
public class ARouterProcessor extends AbstractProcessor 

    ···省略···

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) 
        super.init(processingEnv);

        ···省略···

        //输出获取到的值
        String value = processingEnv.getOptions().get("MyName");
        messager.printMessage(Diagnostic.Kind.NOTE, "heheheh>" + value);
    

    //在编译的时候干活
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) 
        messager.printMessage(Diagnostic.Kind.NOTE, "process is run");
        return false;
    

运行结果展示


项目结构梳理图 


 

以上是关于Android组件化一文教你玩转APT的主要内容,如果未能解决你的问题,请参考以下文章

两句命令教你玩转《黑客帝国》中的“代码雨”

教你玩转Spring Cloud Alibaba,150页全解中文文档,限时分享

手把手教你玩转Canvas

教你玩转流程图控件GoJS:使用TextBlock类显示文本

Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度

手摸手教你玩转 vue render 函数