国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

JDK6.0的新特性:使用Compiler API

2019-11-18 15:30:30
字體:
來源:轉載
供稿:網友

  現(xiàn)在我們可以用JDK6 的Compiler API(JSR 199)去動態(tài)編譯java源文件,Compiler API結合反射功能就可以實現(xiàn)動態(tài)的產生Java代碼并編譯執(zhí)行這些代碼,有點動態(tài)語言的特征。這個特性對于某些需要用到動態(tài)編譯的應用程序相當有用, 比如jsp Web Server,當我們手動修改JSP后,是不希望需要重啟Web Server才可以看到效果的,這時候我們就可以用Compiler API來實現(xiàn)動態(tài)編譯JSP文件,當然,現(xiàn)在的JSP Web Server也是支持JSP熱部署的,現(xiàn)在的JSP Web Server通過在運行期間通過Runtime.exec或PRocessBuilder來調用javac來編譯代碼,這種方式需要我們產生另一個進程去做編譯工作,不夠優(yōu)雅而且輕易使代碼依靠與特定的操作系統(tǒng);Compiler API通過一套易用的標準的API提供了更加豐富的方式去做動態(tài)編譯,而且是跨平臺的。 下面代碼演示了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+" classes//prodUCtion//JDK6Features");
   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();//創(chuàng)建動態(tài)編譯得到的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兩個文件,并在控制臺輸出:

  In the constructor of DynamicObject進入討論組討論。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 于田县| 巫溪县| 慈溪市| 绥棱县| 新干县| 西藏| 莱芜市| 邯郸市| 雅江县| 阜宁县| 永寿县| 霞浦县| 胶州市| 交城县| 壶关县| 偃师市| 东乡县| 巩义市| 七台河市| 西乌珠穆沁旗| 乾安县| 车险| 城市| 航空| 武义县| 饶阳县| 福州市| 达日县| 应用必备| 大冶市| 措勤县| 白银市| 舒兰市| 永靖县| 和静县| 建阳市| 合川市| 墨江| 监利县| 辛集市| 栖霞市|