Использование com.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 для файлов, однако я хотел бы получить эти сгенерированные классы в виде строк.

Глядя на Javadoc и исходный код JCodeModel, я все равно не вижу, как этого добиться.

Как я могу получить сгенерированные классы в виде строки вместо/а также записи их в файл?

Можно ли расширить com.sun.codemodel.CodeWriter для создания строки?


person Hector    schedule 16.01.2018    source источник


Ответы (1)


Конечно! Создание только 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() {
    }

}
person John Ericksen    schedule 17.01.2018