原文連接: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