java 动态编译自己写过程的机会比较少,记录一下:

 package com.xzlf.dynamicCompile;

 import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader; import javax.tools.JavaCompiler;
import javax.tools.ToolProvider; /**
* java 动态性
* @author xzlf
*
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int run = compiler.run(null, null, null, "f:/aa/temp/HelloWorld.java");
System.out.println(run == 0 ? "编译成功" : "编译失败");
/*
// 通过RunTime 调用执行器 启动新进程运行
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -cp f:/aa/temp HelloWorld");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String info;
while((info = reader.readLine()) != null) {
System.out.println(info);
}
reader.close();
*/ // 通过反射运行编译好的类
try {
URL[] urls = new URL[] {new URL("file:/f:/aa/temp/")};
URLClassLoader loader = new URLClassLoader(urls);
Class<?> c = loader.loadClass("HelloWorld");
// 调用加载类的main方法
Method m = c.getMethod("main", String[].class);
m.invoke(null, (Object)new String[] {});
//由于可变参数是JDK5.0之后才有。
//m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
//因此,必须要加上(Object)转型,避免这个问题。
//public static void main(String[] args) } catch (Exception e) {
e.printStackTrace();
} }
}

运行测试:

Java 动态编译--DynamicCompiler-LMLPHP

04-13 12:53