国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 乐至县| 丹凤县| 桃园县| 正阳县| 萝北县| 利川市| 桐城市| 托里县| 公主岭市| 福建省| 柳林县| 东光县| 社会| 格尔木市| 贵南县| 全州县| 华安县| 兰溪市| 丘北县| 枣庄市| 安平县| 扶绥县| 哈巴河县| 海南省| 丰城市| 襄樊市| 错那县| 常州市| 扬州市| 南木林县| 体育| 闸北区| 乌兰县| 大丰市| 获嘉县| 六盘水市| 大石桥市| 高安市| 澎湖县| 革吉县| 高州市|