動態編譯_DynamicCompile、反射調用main方法問題JAVA214

來源:http://www.bjsxt.com/
一、S02E214_01動態編譯_DynamicCompile、反射調用main方法問題

動態編譯機制

通過JavaCompiler動態編譯

通過Runtime和反射運行編譯好的類

代碼測試:

public class HelloWorld {
    public static void main(String[] args){
        System.out.println("Hi!!!!");
    }
}
package com.test.dynamicCompile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class Demo {
    public static void main(String[] args) throws IOException {

        //1、通過JavaCompiler動態編譯
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int result = compiler.run(null,null,null,"G:/JAVA/test/HelloWorld.java");
        System.out.println(result==0?"編譯成功":"編譯失敗");

        //通過IO流操作,將字符串存儲成一個臨時文件,然後調用動態編譯方法!
        String str = "public class Hi { public static void main(String[] args){System.out.println(\"HAHA\");}}";
        //此處省略一大段代碼。。。

        //2、通過Runtime.getRuntime()運行啓動新的進程動態運行編譯好的類
        Runtime run = Runtime.getRuntime();
        Process process = run.exec("java -cp g:/java/test HelloWorld");
        InputStream in = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String info = "";
        while ((info=reader.readLine())!=null) {
            System.out.println(info);
        }

        //3、通過反射運行編譯好的類
        try {
            URL[] urls = new URL[] {new URL("file:/" + "g:/java/test/")};
            URLClassLoader loader = new URLClassLoader(urls);
            Class c = loader.loadClass("HelloWorld");
            //調用加載類的main方法
            Method m = c.getMethod("main", String[].class);
            m.invoke(null, (Object)new String[]{});
            //m.invoke(null, new String[]{"a","b"});
            //上面代碼會被編譯成:m.invoke(null,"a","b"),這樣就發生參數個數不匹配的問題
            //因此,必須加上(Object)進行轉型,避免這個問題
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

控制檯輸出

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