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();
}
}
}