JDK6.0的新特性之四:使用Compiler API
現在我們可以用JDK6 的Compiler API()去動態編譯Java原始檔,Compiler API結合反射功能就可以實現動態的產生Java程式碼並編譯執行這些程式碼,有點動態語言的特徵。這個特性對於某些需要用到動態編譯的應用程式相當有用, 比如JSP Web Server,當我們手動修改JSP後,是不希望需要重啟Web Server才可以看到效果的,這時候我們就可以用Compiler API來實現動態編譯JSP檔案,當然,現在的JSP Web Server也是支援JSP熱部署的,現在的JSP Web Server透過在執行期間透過Runtime.exec或ProcessBuilder來呼叫javac來編譯程式碼,這種方式需要我們產生另一個程式去做編譯工作,不夠優雅而且容易使程式碼依賴與特定的作業系統;Compiler API透過一套易用的標準的API提供了更加豐富的方式去做動態編譯,而且是跨平臺的。 下面程式碼演示了Compiler API的使用
public class CompilerAPITester {
private static String JAVA_SOURCE_FILE = "DynamicObject.java";
private static String JAVA_CLASS_FILE = "DynamicObject.class";
private static String JAVA_CLASS_NAME = "DynamicObject";
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
generateJavaClass(); try {
//將產生的類檔案複製到程式的ClassPath下面,下面這一行程式碼是特定於Windows+IntelliJ IDEA 6.0專案,不具有移植性
Runtime.getRuntime().exec("cmd /c copy "+JAVA_CLASS_FILE+" classesproductionJDK6Features");
Iterable extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE);
compiler.getTask(null, fileManager, null, null, null, sourcefiles).call();
fileManager.close();
Class.forName(JAVA_CLASS_NAME).newInstance();//建立動態編譯得到的DynamicObject類的例項
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void generateJavaClass(){
try {
FileWriter fw = new FileWriter(JAVA_SOURCE_FILE);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("public class "+JAVA_CLASS_NAME+"{");
bw.newLine();
bw.write("public "+JAVA_CLASS_NAME+"(){System.out.println("In the constructor of DynamicObject");}}");
bw.flush();
bw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
程式執行後,會產生DynamicObject.java和DynamicObject.class兩個檔案,並在控制檯輸出
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-889294/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JDK6.0的新特性:使用Compiler APIJDKCompileAPI
- JDK6.0的新特性之六:插入式註解處理API(Pluggable Annotation Processing API)JDKAPI
- JDK6.0的新特性之五:輕量級Http ServerJDKHTTPServer
- JDK6.0的新特性之三:理解StAXJDK
- Java 8新特性(四):新的時間和日期APIJavaAPI
- 【MySQL】5.7新特性之四MySql
- JDK6.0的新特性之一:Desktop和SystemTray類JDK
- JDK6.0的新特性之二:使用JAXB2來實現物件與XML之間的對映JDK物件XML
- JDK 9新特性之Flow API 初探JDKAPI
- Oracle11新特性——PLSQL新特性(四)OracleSQL
- JDK6.0與JDK4.0相比有什麼新特性JDK
- Java 8新特性之旅:使用Stream API處理集合JavaAPI
- css3新特性之動畫使用CSSS3動畫
- Teradata新特性之reset when使用
- Java8新特性--Stream APIJavaAPI
- Java 8新特性(二):Stream APIJavaAPI
- Oracle 12c 新特性(四)Oracle
- MySQL5.7新特性之備份工具mysqlpump的使用MySql
- JDK 8 新特性之函數語言程式設計 → Stream APIJDK函數程式設計API
- java 8新特性學習之四:Java 8 lambda表示式初步第四回Java
- Oracle 12c新特性之Sequence的Session特性OracleSession
- 10G新特性筆記之安裝新特性筆記
- 【MySQL】5.7新特性之五MySql
- 【MySQL】5.7新特性之六MySql
- 【MySQL】5.7新特性之七MySql
- C++ 11 新特性之容器相關特性C++
- Java8新特性之日期-時間APIJavaAPI
- java8 新特性之日期時間 APIJavaAPI
- Java8新特性第3章(Stream API)JavaAPI
- C++11 新特性——auto 的使用C++
- 10G新特性筆記之備份恢復新特性筆記
- Android N 完全不同以往的四個新特性Android
- JDK8新特性之stream()JDK
- HTML5 新特性之 WebsocketHTMLWeb
- Java8新特性之:OptionalJava
- Java 8 新特性之方法引用Java
- ES6 新特性之SymbolSymbol
- MySQL 8 新特性之Clone PluginMySqlPlugin