• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • JDK6.0的新特性:使用Compiler API

    發表于:2007-04-27來源:作者:點擊數: 標簽:JDK6.0新特性Compiler特性使用
    現在我們可以用JDK6 的Compiler API(JSR 199)去動態編譯 Java 源文件,Compiler API結合反射功能就可以實現動態的產生Java代碼并編譯執行這些代碼,有點動態語言的特征。這個特性對于某些需要用到動態編譯的應用程序相當有用, 比如JSP Web Server,當我們手
      現在我們可以用JDK6 的Compiler API(JSR 199)去動態編譯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+" 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();//創建動態編譯得到的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

      查看關于 JDK 的全部文檔

    ·Java初學者專區  ·Java高級技術
    ·Java圖像與多媒體 ·Java網絡編程
    ·Eclipse ·Hibernate
    ·Spring ·Struts
    ·Java設計模式 ·EJB開發 

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    ...
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>