动态编译应用场景:
1、做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统。
2、服务器动态加载某些类文件进行编译。
动态编译的两种做法:
-通过Runtime调用javac,启动新的进程去操作
Runtime run=Runtime.getRuntime();
Process process=run.exec("javac -cp d:/myjava/ HelloWorld");
-通过JavaCompiler动态编译
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "d:/myjava/HelloWorld.java");
System.out.println(result == 0 ? "编译成功" : "编译失败");
}
run方法:
第一个参数:为java编译器提供参数
第二个参数:得到java编译器的输出信息
第三个参数:接收编译器的错误信息
第四个参数:可变参数(是一个String数组)能传入一个或者多个java源文件。
返回值:0表示编译成功,非0表示编译失败
动态运行方式一:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -cp d:/myjava HelloWorld");
InputStream in = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str = "";
if ((str = br.readLine()) != null) {
System.out.println(str);
}
动态运行方式二:
URL[] urls = {new URL("file:/d:/myjava/")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("HelloWorld");
// 数组不转为object类型,编译器会将数组分解传入,相当于参数是invoke(null,"aa","bb"),参数不匹配
c.getMethod("main", String[].class).invoke(null, (Object) new String[]{});
网友评论