package st01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
/**
* 动态编译
* @author asus69
*
*/
public class DynamicCompiler {
public static void main(String[] args) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException, SecurityException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int res = compiler.run(null,null, null, "H://myjava/HelloWorld.java");
System.out.println(res==0?"编译成功":"编译失败");
//运行
//方式一:命令方式
Process process = Runtime.getRuntime().exec("java -cp H://myjava HelloWorld");
InputStream in = process.getInputStream();
InputStreamReader isr=new InputStreamReader(in);
//用缓冲器读行
BufferedReader br=new BufferedReader(isr);
String line=null;
//直到读完为止
while((line=br.readLine())!=null)
{
System.out.println(line);
}
//方式二:使用类加载器加载
URL[] urls = {new URL("file:/"+"H://myjava/")};
URLClassLoader loader = new URLClassLoader(urls);
Class c =loader.loadClass("HelloWorld");
Method method = c.getMethod("main",String[].class);
method.invoke(null,(Object)new String[]{});
}
}
温馨提示:运行可能会报错,将Java文件编译成class文件时用到JavaCompiler报空指针异常。
解决方法:把jre换成jdk即可(如果还不行,在确认正确引入jdk后再看看是不是jdk版本过低,jdk1.8肯定是没问题的)
所以,我们平时在开发平台(如Eclipse)里引用jdk还是jre 在这里已经体现的很明显了。jdk是开发用的,jre是运行用的,jre里面的东西毕竟没有jdk全,所以做开发,尽量引用jdk而不是jre,不然出问题还找不到方向。
解决方案来自:https://blog.csdn.net/superit401/article/details/78524383