动态编译-反射调用
来源:互联网 发布:硕放菜鸟网络招聘 编辑:程序博客网 时间:2024/05/21 08:56
一、动态编译
- JAVA6.0引入了动态编译机制。
- 动态编译的应用场景:
- 可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统,需要进行安全检查。
- 服务器动态加载某些类文件进行编译
二、动态编译的两种做法:
1.通过Runtime调用javac,启动新的进程去操作(jdk5.0以前)
- Runtime run=Runtime.getRuntime();
- Process process = run.exec("javac -cp e:/java/helloworld.java");
2.通过javaCompiler动态编译(常用)
代码:- <pre name="code" class="java"> JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
- int flag = compiler.run(null, null, null,"E:/workspace/images/TestJava.java");
- System.out.println(flag == 0 ? "编译成功" : "编译失败");
第一个参数:为java编译器提供参数第二个参数:得到java编译器的输出信息第三个参数:接受编译器的错误信息第四个参数:可变参数(是一个String数组)能传入一个或多个java源文件返回值:0表示编译成功,非0表示编译失败三、动态运行编译好的类
1.通过Runtime.getRuntime()运行启动新的进程运行
例如:- <pre name="code" class="java"> Runtime run = Runtime.getRuntime();
- Process process = run.exec("java -cp E:/workspace/images TestJava");
2.通过反射运行编译好的类
例如:- try {
- URL[] urls = new URL[] { new URL("file:/" + "E:/workspace/images/") };
- URLClassLoader loader = new URLClassLoader(urls);
-
- Class clazz = loader.loadClass("TestJava");
- Method m = clazz.getMethod("main", String[].class);
-
-
-
- m.invoke(null, (Object) new String[] {});
-
- } catch (Exception e) {
- e.printStackTrace();
- }
注意:反射中的可变参数
整体Demo:
- public class TestCompil {
- public static void main(String[] args) throws IOException {
-
- String strjava = "public class TestJava{public static void main(String[] args){System.out.println(\"nihao\");}}";
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream("E:/workspace/images/TestJava.java")));
- bw.write(strjava);
- bw.flush();
- bw.close();
-
- JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
- int flag = compiler.run(null, null, null,"E:/workspace/images/TestJava.java");
- System.out.println(flag == 0 ? "编译成功" : "编译失败");
-
-
-
- Runtime run = Runtime.getRuntime();
- Process process = run.exec("java -cp E:/workspace/images TestJava");
-
- InputStream is = process.getInputStream();
- BufferedReader bis = new BufferedReader(new InputStreamReader(is));
- String info = null;
- while (null != (info = bis.readLine())) {
- System.out.println(info);
- }
-
-
- try {
- URL[] urls = new URL[] { new URL("file:/" + "E:/workspace/images/") };
- URLClassLoader loader = new URLClassLoader(urls);
-
- Class clazz = loader.loadClass("TestJava");
- Method m = clazz.getMethod("main", String[].class);
-
-
-
- m.invoke(null, (Object) new String[] {});
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- }
结果:
编译成功
nihao
nihao
0 0