Java 動態編譯組件 & 類動態加載


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

http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/javax/tools/JavaCompiler.html

 


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM