Java动态编译,运行

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

你可能感兴趣的:(基础,学习)