JavaPoet - 生成Java代码

贺兴平
2023-12-01

一、介绍

  JavaPoet项目可以动态的生成Java文件,使用注解的时候假如需要生成新的Java文件就可以通过这个开源项目实现。
  项目地址:https://github.com/square/javapoet

二、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类了。

五、调用HelloWorld类的show方法


    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

 

 类似资料: