一、介绍
1.应用场景
客户端上传代码在线编译的系统,服务器动态加载某些类文件进行编译
2.动态编译实现
2.1利用java启动新进程操作
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/my/java HelloWorld");
2.2通过JavaComplier动态编译
二、测试
1.在本地创建一个java文件,并编写main方法
编写客户端
2.编写测试类
public class Test01
{
public static void main(String[]args)
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int run =compiler.run(null,null,null,"D:/Java/Test02.java");
System.out.println(run ==
0 ? "编译成功" :"编译失败");
}
}
本地多了一个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 (Exceptione) {
e.printStackTrace();
}
}
}
运行结果