java動態編程-動態編譯機制

java可以在運行時,進行動態編譯,也就是說,可以在代碼中,由程序控制進行編譯

倆種動態編譯方法:
1.執行cmd命令,調用javac進行編譯
2.利用java提供的JavaComplier
3.可以利用類加載器還有java反射來執行編譯好的字節文件

/**
 * java 動態編譯
 * @author liuxg
 * @date 2016年5月24日 上午9:15:00
 */
public class DynamicDemo {


    public static void main(String[] args) {

        DynamicDemo dy = new DynamicDemo();

        dy.javaCompilerDemo();
        //dy.runTimeDemo();
        dy.excuteDemo();

    }

    /**
     * run的參數
     * 1.標準輸入流,爲空時候,默認使用system.in
     * 2.標準輸出流,爲空時候,默認使用system.out
     * 1.標準異常,爲空時候,默認使用system.error
     * @return 0 表示成功 1表示失敗
     */
    private void  javaCompilerDemo(){

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
        int result =  compiler.run(null,null,null,"D:\\myclass\\com\\jvm\\demo\\HelloLiuxg.java");

        System.out.println(result == 0 ? "javaCompiler編譯成功" : "javaCompiler編譯失敗");

    }

    /**
     * 通過執行cmd命令,runtime編譯
     */
    private void runTimeDemo(){
        try {
            Runtime run = Runtime.getRuntime();
            run.exec("javac -cp javac D:\\myclass\\com\\jvm\\demo\\HelloLiuxg.java");
            System.out.println( "Runtime編譯成功");
        } catch (IOException e) {
            System.out.println( "Runtime編譯失敗");
            e.printStackTrace();
        }
    }

    /**
     * 執行字節碼
     */
    private void excuteDemo(){

        try {
            URL[] urls  = new URL[]{new URL("file://D:/myclass/com/jvm/demo/HelloLiuxg.class")};
            URLClassLoader loader = new URLClassLoader(urls);
            Class<HelloLiuxg> clazz = (Class<HelloLiuxg>) loader.loadClass("com.jvm.demo.HelloLiuxg");
            HelloLiuxg HelloLiuxg = clazz.newInstance();
            System.out.println(HelloLiuxg.hello());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章