我正在调查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
以生成字符串?
答案 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() {
}
}