1、JDK6 動態編譯組件
Java SE 6 之后自身集成了運行時編譯的組件:javax.tools,存放在 tools.jar 包里,可以實現 Java 源代碼編譯,幫助擴展靜態應用程序。該包中提供主要類可以從 Java String、StringBuffer 或其他 CharSequence 中獲取源代碼並進行編譯。接下來通過代碼一步步講述如何利用 JDK6 特性進行運行時編譯。
// 通過 ToolProvider 取得 JavaCompiler 對象,JavaCompiler 對象是動態編譯工具的主要對象 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // 通過 JavaCompiler 取得標准 StandardJavaFileManager 對象,StandardJavaFileManager 對象主要負責 // 編譯文件對象的創建,編譯的參數等等,我們只對它做些基本設置比如編譯 CLASSPATH 等。 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); // 因為是從內存中讀取 Java 源文件,所以需要創建我們的自己的 JavaFileObject,即 InMemoryJavaFileObject JavaFileObject fileObject = new InMemoryJavaFileObject(className, codeString); Iterable<? extends JavaFileObject> files = Arrays.asList(fileObject);
// 從文件讀取編譯源代碼
//Files[] javafiles = ... ; // input for first compilation task
//Iterable<? extends JavaFileObject> files = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(javafiles));
// 編譯結果信息的記錄 StringWriter sw = new StringWriter(); // 編譯目的地設置 Iterable options = Arrays.asList("-d", classOutputFolder); // 通過 JavaCompiler 對象取得編譯 Task JavaCompiler.CompilationTask task = compiler.getTask(sw, fileManager, null, options, null, files); // 調用 call 命令執行編譯,如果不成功輸出錯誤信息 if (!task.call()) { String failedMsg = sw.toString(); System.out.println(“Build Error:” + failedMsg); } // 自定義 JavaFileObject 實現了 SimpleJavaFileObject,指定 string 為 java 源代碼,這樣就不用將源代碼 // 存在內存中,直接從變量中讀入即可。 public static class InMemoryJavaFileObject extends SimpleJavaFileObject { private String contents = null; public InMemoryJavaFileObject(String className, String contents) { super(URI.create("string:///" + className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.contents = contents;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return contents; } }
http://www.ibm.com/developerworks/cn/java/j-lo-jdk6forosgi/
http://www.ibm.com/developerworks/cn/java/j-lo-jse64/index.html?S_TACT=105AGX52&S_CMP=techcto
http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html