小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 bluecrystal 2007-06-25
JDK6的新特性之四:使用Compiler API(轉(zhuǎn))
JDK6的新特性之四:使用Compiler API 
現(xiàn)在我們可以用JDK6 的Compiler API(JSR 199)去動態(tài)編譯Java源文件,Compiler API結(jié)合反射功能就可以實現(xiàn)動態(tài)的產(chǎn)生Java代碼并編譯執(zhí)行這些代碼,有點動態(tài)語言的特征。這個特性對于某些需要用到動態(tài)編譯的應(yīng)用程序相當有用, 比如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來調(diào)用javac來編譯代碼,這種方式需要我們產(chǎn)生另一個進程去做編譯工作,不夠優(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 {
            //將產(chǎn)生的類文件拷貝到程序的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();
        }
    }
}

程序運行后,會產(chǎn)生DynamicObject.java和DynamicObject.class兩個文件,并在控制臺輸出

In the constructor of DynamicObject

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多