JavaPoet项目可以动态的生成Java文件,使用注解的时候假如需要生成新的Java文件就可以通过这个开源项目实现。
项目地址:https://github.com/square/javapoet
JavaFile 用于构造输出包含一个顶级类的Java文件
TypeSpec 生成类,接口,或者枚举
MethodSpec 生成构造函数或方法
FieldSpec 生成成员变量或字段
ParameterSpec 用来创建参数
AnnotationSpec用来创建注解
compile 'com.squareup:javapoet:1.8.0'
注意:Android Library 模块module不能用这个包。因为不能应用javax jar包
所以要在java Library中引种。如果是android studio3.0以下的版本要引用javax jar包
//替换实际安装的jdk目录
compile files ('E:/sort/java8/jdk1.8.0_101/jre/lib/rt.jar')
Android studio 配备jdk file->structure--jdk location
生成一个件简单的HelloWorld类,有一个静态方法,只是简单的输出“Hello World”字符串。
import javax.lang.model.element.Modifier;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
MainClass mainClass = new MainClass();
mainClass.generateHelloWord();
}
private void generateHelloWord(){
MethodSpec main = MethodSpec.methodBuilder("show")
.addModifiers(Modifier.PUBLIC,Modifier.STATIC)
.addStatement("$T.out.println($S)",System.class,"Hello World!")
.build();
TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
.addModifiers(Modifier.PUBLIC)
.addMethod(main)
.build();
JavaFile javaFile = JavaFile.builder("com.zhangmiao", helloWorld).build();
File outputFile = new File("src/"); //输出文件
try {
javaFile.writeTo(outputFile);
javaFile.writeTo(System.out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果会显示整个类的内容,运行MainClass之后,选择项目点击右键,运行Refresh之后,就可以在包下看到HelloWorld.java类了。
public static void main(String[] args) {
try {
Class hello = Class.forName("com.zhangmiao.HelloWorld");
hello.newInstance();
Method method = hello.getMethod("show", null);
method.invoke(null, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Class Not Found");
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
System.out.println("No Such Method");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
https://www.cnblogs.com/zhangmiao14/p/6933258.html
https://www.jianshu.com/p/fba2eec47976
https://www.cnblogs.com/coprince/p/8603492.html