JavaPoet是出自JakeWharton一个可以生成.java源代码的开源项目,我们可以结合注解处理器在程序编译阶段动态生成我们想要的代码。下面我们来看看如何使用
准备工作
在已有的Android项目中或新建项目中创建一个Module,如图1-1
然后,在弹出的窗口选择Java Library点击Next,起一个名字就叫lib-javapoet吧,点击Finish完成。如图1-2、图1-3
引入开源项目
打开刚创建的Java库找到build.gradle;
添加依赖:implementation’com.squareup:javapoet:1.11.1’
如图1-4、图1-5
好了下面来实践一下吧。
实践
我们尝试使用JavaPoet来动态生成一个HelloWorld类吧
package com.ethan.javapoet.lib_javapoet;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import java.io.IOException;
import javax.lang.model.element.Modifier;
public class MyClass {
public static void main(String[] args){
generateCode();
}
public static void generateCode(){
//生成一个名为main的方法
MethodSpec main = MethodSpec.methodBuilder("main")
//方法的修饰符为public static
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
//方法返回值为void
.returns(void.class)
//方法的参数为String[] args
.addParameter(String[].class, "args")
//方法体为System.out.println("Hello, JavaPoet!");占位符$T代表导入class(添加类型),占位符$S代表Strings可以替换多个String
.addCode("$T.out.println($S);", System.class, "Hello, JavaPoet!")
.build();
//生成一个名为HelloWorld的类
TypeSpec helloworld = TypeSpec.classBuilder("HelloWorld")
//类的修饰符为public final
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
//将上面的main方法加入类中
.addMethod(main)
.build();
//生成包名为com.ethan.javapoet.lib_javapoet的HelloWorld类的Java源文件
JavaFile javaFile = JavaFile.builder("com.ethan.javapoet.lib_javapoet", helloworld)
.build();
try {
//把生成的代码从控制台输出
javaFile.writeTo(System.out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
好啦,来运行一下上面的代码。
什么鬼???报错了。。。
Exception in thread "main" java.lang.NoClassDefFoundError: com/squareup/javapoet/MethodSpec
怎么会这样?找一下原因,在JavaPoet项目的Issues的Closed中找到有遇到同样错误的,来看看他们是怎么做的。
从上图sunshine763与yanzhenjie两位小伙伴的谈论中我们可以了解到在AndroidStudio中同时有Android Module和Java Module存在那么就会出现这个问题