1.应用场景
客户端上传代码在线编译的系统,服务器动态加载某些类文件进行编译,热部署功能实现
2.动态编译实现
1利用java启动新进程操作
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/my/java HelloWorld");
2通过JavaComplier动态编译
3.测试
1.在本地创建一个java文件,并编写main方法
编写客户端
2.编写测试类
本地多了一个class文件
3.动态运行
3.1应用程序调用
public class Test01 {
public static void main(String[] args) throws Exception {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int run = compiler.run(null, null, null,"D:/Java/Test02.java");
System.out.println(run == 0 ? "编译成功" : "编译失败");
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -cp D:/Java Test02");
//只做测试,为了简洁没关闭流
InputStream inputStream = process.getInputStream();//将编译到的内容打印在控制台上
BufferedReader bis = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while((line = bis.readLine()) != null) {
System.out.println(line);
}
}
}
运行结果
3.2 反射调用
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class Test01 {
public static void main(String[] args) throws Exception {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int run = compiler.run(null, null, null,"D:/Java/Test02.java");
System.out.println(run == 0 ? "编译成功" : "编译失败");
try {
URL[] urls = new URL[]{new URL("file:/"+"D:/Java/")};
URLClassLoader loader = new URLClassLoader(urls);
Class<?> clazz = loader.loadClass("Test02");
//调用main方法
clazz.getMethod("main", String[].class).invoke(null, (Object)new String[]{});
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果