Я использую FreeMarker, чтобы сгенерировать код Java, но поскольку большая часть из него динамично сгенерирована, трудно управлять формированием кода.
Я хочу получить код, хорошо форматированный. Кто-либо знает lib или что-то как симпатичный принтер для кода Java?
Думаю, я буду использовать Eclipse CodeFormatter, как этот парень: http://ssscripting.wordpress.com/2009 / 06/10 / как использовать-код-форматировщик-затмения из-вашего-кода /
ОБНОВЛЕНИЕ: закончил использование jastyle ( http://sourceforge.net/projects/jastyle/ ). вот пример:
public static String formatJavaCode(String code) throws Exception {
ASFormatter formatter = new ASFormatter();
// bug on lib's implementation. reported here: http://barenka.blogspot.com/2009/10/source-code-formatter-library-for-java.html
code.replace("{", "{\n");
Reader in = new BufferedReader(new StringReader(code));
formatter.setJavaStyle();
in.close();
return FormatterHelper.format(in,formatter);
}
Вы можете использовать программы форматирования кода Eclipse или Jalopy для переформатирования сгенерированного кода.
Вы можете запустить программу форматирования, например astyle
Jalopy работает великолепно. Вы можете использовать его CLI для автономного использования. Japlopy Console Plugin
Вы можете отформатировать его при редактировании файла .java в Eclipse. Когда вы не редактируете его, не имеет значения, отформатирован он или нет.
Я переключился с FreeMarker на свою собственную утилиту генерации исходного кода Java. Источники доступны отсюда: https://source.mysema.com/svn/mysema/projects/codegen/trunk/
Он спроектирован таким образом, что вы просто вызываете API, и вывод правильно отформатирован. Вот пример:
JavaWriter writer = new JavaWriter(new StringWriter());
writer.beginClass("FieldTests");
writer.privateField("String", "privateField");
writer.privateStaticFinal("String", "privateStaticFinal", "\"val\"");
writer.protectedField("String","protectedField");
writer.field("String","field");
writer.publicField("String","publicField");
writer.publicStaticFinal("String", "publicStaticFinal", "\"val\"");
writer.publicFinal("String", "publicFinalField");
writer.publicFinal("String", "publicFinalField2", "\"val\"");
writer.end();
Что превращается в
public class FieldTests {
private String privateField;
private static final String privateStaticFinal = "val";
protected String protectedField;
String field;
public String publicField;
public static final String publicStaticFinal = "val";
public final String publicFinalField;
public final String publicFinalField2 = "val";
}
Я разработал утилиту кодогенерации для Querydsl , которая отображает типы домена Java в типы запросов. Таким образом, потребности в сериализации очень сложны. Использование шаблонов FreeMarker просто не масштабируется.В выводе было слишком много настроек, которые лучше контролировать на Java, чем синтаксис языка шаблонов.
Это не реклама модуля Codegen. Я просто хотел подчеркнуть, что FreeMarker может не масштабироваться для настраиваемой сериализации.