Java学习之-动态编译-DynamicCompile_反射调用
来源:互联网 发布:数据分析实验室 编辑:程序博客网 时间:2024/06/13 08:28
一、动态编译
- 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,new String[]{"aa","bb"});// 由于可变参数是jdk5.0之后才有,上面代码会编译成m.invoke(null,"aa","bb");会发生参数不匹配的问题// 因此必须加上Object 强转m.invoke(null, (Object) new String[] {});} catch (Exception e) {e.printStackTrace();}注意:反射中的可变参数
整体Demo:
public class TestCompil {public static void main(String[] args) throws IOException {// 通过IO流创建一个临时文件,然后动态编译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 ? "编译成功" : "编译失败");//两种动态执行编译方法//1.通过Runtime.getRuntime();启动新的线程进行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);}//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,new String[]{"aa","bb"});// 由于可变参数是jdk5.0之后才有,上面代码会编译成m.invoke(null,"aa","bb");会发生参数不匹配的问题// 因此必须加上Object 强转m.invoke(null, (Object) new String[] {});} catch (Exception e) {e.printStackTrace();}}}
2 0
- Java学习之-动态编译-DynamicCompile_反射调用
- 动态编译-反射调用
- Java学习之 -----动态编译
- Java学习之反射机制---动态代理
- java反射之动态代理学习笔记
- java 反射 动态调用函数
- java反射动态方法调用
- java动态反射调用方法
- java 反射动态方法调用
- java学习之路 之 反射机制(动态代理)
- java学习笔记之动态编译
- 反射和动态代理之Java学习总结
- Java学习笔记之反射的应用-动态代理
- java反射学习笔记之 动态加载类
- JAVA 反射之方法调用
- JAVA反射之调用方法
- Java SE6调用动态编译
- Java SE6调用动态编译
- JSP环境集成包 工具
- poj 2555 Drink, on Ice 物理坐标计算
- 编码实践五要诀
- C++学习之【使用位操作符求素数分析】
- MINA源码简易剖析(一)
- Java学习之-动态编译-DynamicCompile_反射调用
- ios开发-OC的初步学习
- #define XXX do{ XXX } while(0) 为什么会有这种用法
- android IntentService生命周期问题
- 就这么开始吧
- 设计模式之策略模式——角色游戏
- SQL 行列倒置
- CLUVFY工具
- 新功能:Azure 负载平衡器的空闲超时现可配置了