使用com.sun.codemodel;如何将类编写为String而不是文件

时间:2018-01-16 11:45:33

标签: code-generation sun-codemodel

我正在调查com.sun.codemodel以生成Java类。

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

JCodeModel类有多个构建方法,支持为文件生成所需的Java类,但是我想将这些生成的类作为字符串获取。

看看Javodeoc和JCodeModel的源代码我无论如何也看不到这一点。

如何将生成的类作为String而不是/以及将它们写入文件来获取?

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

1 个答案:

答案 0 :(得分:3)

当然!由于JCodeModel生成多个类,因此仅生成String有点棘手。您可以使用自定义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() {
    }

}