Android组件化javaPoet的使用

Posted 我想月薪过万

tags:

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

基础知识回顾


android组件化】一文教你玩转APT_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/122818568?spm=1001.2014.3001.5501 

javaPoet使用教程


square/javapoet: A Java API for generating .java source files. (github.com)https://github.com/square/javapoet

ARouter注解被使用多次


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);
    


@ARouter(path = "MainActivity2")
class MainActivity2 extends Activity 



@ARouter(path = "MainActivity3")
class MainActivity3 extends Activity 


在注解处理器中获取这三个调用的地方 


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

        //循环
        //获取被ARouter注解的“类节点信息”
        Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(ARouter.class);
        for (Element element : elements)  //for 3次 1 MainActivity 2 MainActivity2 3 MainActivity3

        

        return false;
    

使用javaPoet生成模板代码


  • 核心思想 

  • 要生成的模板代码
package com.example.helloworld;

public final class HelloWorld 
  public static void main(String[] args) 
    System.out.println("Hello, JavaPoet!");
  
  • javaPoet的使用

 

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


        //循环
        //获取被ARouter注解的“类节点信息”
        Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(ARouter.class);
        for (Element element : elements)  //for 3次 1 MainActivity 2 MainActivity2 3 MainActivity3
            /**
             *
             * package com.example.helloworld;
             *
             * public final class HelloWorld 
             *   public static void main(String[] args) 
             *     System.out.println("Hello, JavaPoet!");
             *   
             * 
             */
            //1、方法
            MethodSpec mainMethod = MethodSpec.methodBuilder("main")
                    .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
                    .returns(void.class)
                    .addParameter(System[].class, "args")
                    //增加main方法里面的内容
                    .addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
                    .build();
            //2、类
            TypeSpec testClass = TypeSpec.classBuilder("testClass")
                    .addMethod(mainMethod)
                    .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
                    .build();

            //3、包
            JavaFile packagef = JavaFile.builder("com.wustyq.test", testClass).build();

            //4、生成文件
            try 
                packagef.writeTo(filer);
             catch (IOException e) 
                e.printStackTrace();
                messager.printMessage(Diagnostic.Kind.NOTE, "生成Test文件时失败,异常:" + e.getMessage());
            
        

编译结果展示 


有人可能会出现如下把报错:这是因为我们使用了上次ARouter注解,所以重复生成了testClass类导致的

以上是关于Android组件化javaPoet的使用的主要内容,如果未能解决你的问题,请参考以下文章

Android 组件化路由组件 ( 使用 JavaPoet 生成路由表类 )

Android组件化路由实践

JavaPoet 动态生成Java源码---Android

Android JavaPoet 动态生成Java源码

Android组件化一文教你玩转APT

深入理解Java注解——JavaPoet使用