1、动态编译的方式
通过JavaCompiler动态编译
public static void main(String[] args) throws IOException {
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
int result = javaCompiler.run(null, null, null, "D:/a/HelloDemo.java");
System.out.println(result == 0 ? "编译成功" : "编译失败")
}
第一个参数:为java编译器提供参数
第二个参数:得到 Java 编译器的输出信息
第三个参数:接收编译器的 错误信息
第四个参数:可变参数(是一个String数组)能传入一个或多个 Java 源文件
返回值:0表示编译成功,非0表示编译失败
2、动态运行编译好的类
通过Runtime. g e t R u n ti m e () 运行启动新的进程运行
public static void main(String[] args) throws IOException {
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
int result = javaCompiler.run(null, null, null, "D:/a/HelloDemo.java");
System.out.println(result == 0 ? "编译成功" : "编译失败");
//通过Runtime调用执行类
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/a HelloDemo");
InputStream in = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String info = "";
while ((info = reader.readLine()) != null) {
System.out.println(info.toString());
}
}
通过反射运行编译好的类
public static void main(String[] args) throws IOException {
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
int result = javaCompiler.run(null, null, null, "D:/a/HelloDemo.java");
System.out.println(result == 0 ? "编译成功" : "编译失败");
try {
URL[] urls = new URL[]{new URL("file:/" + "D:/a/")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("HelloDemo");
//调用加载类的main方法
Method m = c.getMethod("main", String[].class);
m.invoke(null, (Object) new String[]{});
} catch (Exception e) {
e.printStackTrace();
}
}
3、动态编译的应用场景
1、可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测 系统。
2、服务器动态加载某些类文件进行编译
每天进步一丢丢
完成