使用 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() {
}
}
我正在研究 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() {
}
}