一、介绍
1.应用场景
客户端上传代码在线编译的系统,服务器动态加载某些类文件进行编译

2.动态编译实现

2.1利用java启动新进程操作
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/my/java HelloWorld");

2.2通过JavaComplier动态编译
Java动态编译

二、测试

1.在本地创建一个java文件,并编写main方法
Java动态编译
编写客户端

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 ? "编译成功" :"编译失败");
}
}
Java动态编译
本地多了一个class文件
Java动态编译

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);
}
}
}
运行结果
Java动态编译

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();
}
}
}
运行结果
Java动态编译


相关文章:

  • 2021-12-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-17
  • 2021-10-15
相关资源
相似解决方案