基础知识回顾
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类导致的