乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JDK6的新特性之四:使用Compiler API

       bluecrystal 2007-06-25
      JDK6的新特性之四:使用Compiler API(轉(zhuǎn))
      JDK6的新特性之四:使用Compiler API 
      現(xiàn)在我們可以用JDK6 的Compiler API(JSR 199)去動(dòng)態(tài)編譯Java源文件,Compiler API結(jié)合反射功能就可以實(shí)現(xiàn)動(dòng)態(tài)的產(chǎn)生Java代碼并編譯執(zhí)行這些代碼,有點(diǎn)動(dòng)態(tài)語(yǔ)言的特征。這個(gè)特性對(duì)于某些需要用到動(dòng)態(tài)編譯的應(yīng)用程序相當(dāng)有用, 比如JSP Web Server,當(dāng)我們手動(dòng)修改JSP后,是不希望需要重啟Web Server才可以看到效果的,這時(shí)候我們就可以用Compiler API來(lái)實(shí)現(xiàn)動(dòng)態(tài)編譯JSP文件,當(dāng)然,現(xiàn)在的JSP Web Server也是支持JSP熱部署的,現(xiàn)在的JSP Web Server通過(guò)在運(yùn)行期間通過(guò)Runtime.exec或ProcessBuilder來(lái)調(diào)用javac來(lái)編譯代碼,這種方式需要我們產(chǎn)生另一個(gè)進(jìn)程去做編譯工作,不夠優(yōu)雅而且容易使代碼依賴與特定的操作系統(tǒng);Compiler API通過(guò)一套易用的標(biāo)準(zhǔn)的API提供了更加豐富的方式去做動(dòng)態(tài)編譯,而且是跨平臺(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 {
                  //將產(chǎn)生的類文件拷貝到程序的ClassPath下面,下面這一行代碼是特定于Windows+I(xiàn)ntelliJ IDEA 6.0項(xiàng)目,不具有移植性
                  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)建動(dòng)態(tài)編譯得到的DynamicObject類的實(shí)例
              } 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();
              }
          }
      }

      程序運(yùn)行后,會(huì)產(chǎn)生DynamicObject.java和DynamicObject.class兩個(gè)文件,并在控制臺(tái)輸出

      In the constructor of DynamicObject

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多