使用 com.sun.codemodel;如何将 class 写为字符串而不是文件

Using com.sun.codemodel; how to write class as String instead of to a File

我正在研究 com.sun.codemodel 以生成 Java classes.

// https://mvnrepository.com/artifact/com.sun.codemodel/codemodel
compile group: 'com.sun.codemodel', name: 'codemodel', version: '2.6'

JCodeModel class 有多种构建方法支持生成所需的 Java classes 到文件,但是我想获得这些生成的 classes 作为字符串。

查看 JavaJCodeModel 的文档和源代码,我无论如何都看不到实现这一点。

如何将生成的 classes 作为字符串而不是 of/as 并将它们写入文件?

是否可以扩展 com.sun.codemodel.CodeWriter 以生成字符串?

好的!只生成一个 String 有点棘手,因为 JCodeModel 会生成多个 类。您可以查找这些 类 并使用自定义 CodeWriter 将它们输出为字符串,如下所示:

JCodeModel codeModel = new JCodeModel();

JDefinedClass testClass = codeModel._class("test.Test");
testClass.method(JMod.PUBLIC, codeModel.VOID, "helloWorld");

final Map<String, ByteArrayOutputStream> streams = new HashMap<String, ByteArrayOutputStream>();

CodeWriter codeWriter = new CodeWriter() {
    @Override
    public OutputStream openBinary(JPackage jPackage, String name) {
        String fullyQualifiedName = jPackage.name().length() == 0 ? name : jPackage.name().replace(".", "/") + "/" + name;

        if(!streams.containsKey(fullyQualifiedName)) {
            streams.put(fullyQualifiedName, new ByteArrayOutputStream());
        }
        return streams.get(fullyQualifiedName);
    }

    @Override
    public void close() throws IOException {
        for (OutputStream outputStream : streams.values()) {
            outputStream.flush();
            outputStream.close();
        }
    }
};

codeModel.build(codeWriter);

System.out.println(streams.get("test/Test.java"));

输出:

public class Test {


    public void helloWorld() {
    }

}