2010-05-20 170 views
5

我正在使用FreeMarker生成Java代碼,但由於它大部分是動態生成的,因此很難控制代碼的形成。Java代碼格式化

我想要得到格式良好的代碼。有沒有人知道一個lib或類似的Java代碼漂亮的打印機?

+0

http://stackoverflow.com/questions/996646/stand-alone-java-code-formatter-beautifier-pretty-printer – 2015-04-28 09:20:55

回答

0

我想我會使用Eclipse的CodeFormatter,就像這個傢伙:http://ssscripting.wordpress.com/2009/06/10/how-to-use-the-eclipse-code-formatter-from-your-code/

UPDATE: 結束了使用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); 
} 
1

您可以使用Eclipse's或Jalopy代碼格式化程序重新格式化生成的代碼。

+0

但我想以編程方式做到這一點。 eclipse的代碼formater可以用作獨立的lib嗎? – 2010-05-20 17:28:27

+0

理論上是的,但不會是一個微不足道的練習。但我相信Jalopy格式化器可以更容易嵌入。 – 2010-05-20 18:28:39

+0

是的,我的第一個實現是使用Eclipse的格式化程序完成的。但我最終與http:// sourceforge交換了這個信息。網/項目/ jastyle /因爲它的簡單。 – 2010-05-21 16:15:40

1

您可以運行像astyle

+0

你知道java中的一個庫,它也是這樣做的。我想要一個包含在我的項目中,並將所有生成的字符串傳遞給格式化程序。 – 2010-05-20 17:43:55

+1

並且有一個java端口:http://sourceforge.net/projects/jastyle/ – 2010-05-21 16:13:25

0

你可以當你在Eclipse中編輯的.java文件格式化。 當你不編輯它時,它是否被格式化並不重要。

0

我從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可能無法擴展。

+0

這些源代碼已移至https://source.mysema.com/svn/mysema/projects/deprecated/codegen/trunk – migu 2012-03-09 08:48:27

1

Google java格式對我來說非常完美。 https://github.com/google/google-java-format

行家構建之後,找到谷歌-java的格式-0.1-SNAPSHOT.jar在芯/目標文件夾,並嘗試java -jar google-java-format-0.1-SNAPSHOT.jar看到使用信息。

0

最簡單的方法是將代碼粘貼到eclipse java IDE中,然後在您選擇的代碼上按Ctrl + f。這將以易於閱讀的形式格式化您的代碼。