【Android组件化】javaPoet的使用

基础知识回顾


【Android组件化】一文教你玩转APT_我想月薪过万的博客-CSDN博客icon-default.png?t=M0H8https://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)icon-default.png?t=M0H8https://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类导致的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值