分享代碼片斷:如何對自動生成的java代碼作自動格式化,以達到接近手寫的效果

原文連接:https://gist.github.com/pfmiles/653c8b59e795698c867djava

如題,有的時候,咱們會採用自動生成java代碼的方式來完成一些任務,好比根據業務數據自動生成調用api的sdk供用戶下載、使用;
這樣自動生成的代碼,若是未經格式化處理,基本上是不可讀的;git

正好,咱們經常使用的eclipse,快捷鍵"ctrl + shift + F"就能自動格式化java代碼;
那麼,下面這段代碼,就是將eclipse的這個功能模塊給「摳」出來單獨調用,達到格式化java代碼的目的:github

package test;

import java.util.Map;

import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.text.edits.TextEdit;

/**
 * 調用eclipse jdt core對生成的java源碼進行格式化
 * 
 * @author pf-miles 2014-4-16 下午2:48:29
 */
public class JavaCodeFormattingUtil {

    /**
     * 嘗試對傳入的JavaSourceFile格式化,此操做若成功則將改變傳入對象的內容
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void tryFormat(JavaSourceFile src) {
        Map m = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
        m.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_6);
        m.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_6);
        m.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6);
        m.put(DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, "160");
        m.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE);

        String code = null;
        IDocument doc = null;
        try {
            code = src.getCharContent(true).toString();
            CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(m);
            TextEdit textEdit = codeFormatter.format(CodeFormatter.K_UNKNOWN, code, 0, code.length(), 0, null);
            if (textEdit != null) {
                doc = new Document(code);
                textEdit.apply(doc);
                src.setCode(doc.get());
            }
        } catch (Exception e) {
            throw new RuntimeException("Error occured while formatting code: " + src.toUri(), e);
        }
    }
}

其中「code = src.getCharContent(true).toString();」這一行先沒必要關心"src"是個什麼對象,那是咱們自定義的東西,這裏的重點只須要獲得「code」,而後後面的操做徹底是針對"code"這個string形式的java代碼而作;api

其中還能對格式化屬性作一些配置, 如:
VERSION_1_6是指對應的java版本;
而DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT則指一行最多到多長就會自動換行;
DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR是說想要使用什麼字符來作縮進,通常都選擇空格或tab;
這些均可以根據需求隨意調整;app

固然,上述這些代碼的運行,是須要依賴eclipse的格式化模塊功能庫的,這個庫,目前沒有統一的依賴地址;能夠根據類名上網隨便搜一個可用的maven倉庫依賴便可eclipse

相關文章
相關標籤/搜索