0
点赞
收藏
分享

微信扫一扫

【Android组件化】javaPoet的使用

天蓝Sea 2022-03-30 阅读 67


基础知识回顾

【Android组件化】一文教你玩转APT_我想月薪过万的博客-

javaPoet使用教程

​​square/javapoet: A Java API for generating .java source files. (github.com)【Android组件化】javaPoet的使用_java​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 {

}

【Android组件化】javaPoet的使用_ide_02

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

//在编译的时候干活
@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生成模板代码

  • 核心思想

【Android组件化】javaPoet的使用_android_03

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

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

【Android组件化】javaPoet的使用_ide_04


//在编译的时候干活
@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());
}
}

编译结果展示 

【Android组件化】javaPoet的使用_java_05

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

【Android组件化】javaPoet的使用_ide_06


举报

相关推荐

0 条评论