Java学习之 -----动态编译
来源:互联网 发布:sql分类合计 编辑:程序博客网 时间:2024/05/17 01:55
一、动态编译
1、Java 6.0 引入了动态编译机制。
2、动态编译的应用场景:
二、动态编译的两种方法可以做一个java的在线编译器,可以在浏览器端编写java代码,服务器动态加载某些类文件进行编译。注意要进行安全检查!!!
1、通过Runtime调用javac,启动新的进程去操作(jdk5.0以前)
Runtime run=Runtime.getRuntime(); Process process = run.exec("javac -cp e:/java/helloworld.java");2、通过javaCompiler动态编译(常用)
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()运行启动新的进程运行
例如: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(); } } }
阅读全文
1 0
- Java学习之 -----动态编译
- java学习笔记之动态编译
- java之动态编译
- Java学习之-动态编译-DynamicCompile_反射调用
- Java学习之动态编译--字节码操作--javassist类库
- Java基础之动态编译
- Java学习之动态编译-动态脚本引擎-脚本引擎执行javascript代码
- 学习笔记——JAVA动态编译
- 学习笔记——JAVA动态编译
- 学习笔记之——静态编译和动态编译
- JAVA学习之动态代理
- JAVA学习之动态代理
- JAVA学习之动态代理
- Java之动态编译,静态编译简单理解和实例
- java 内存编译-动态编译
- JAVA学习(15)Vs2015+eclipse编译Qt动态库模块
- 动态编译JAVA程序
- 动态编译Java程序
- pop显示以及动画
- 【转】漫谈Moq(四)
- 小程序资源包加载失败
- 基于R的高级数据管理
- Java_基础—File类的创建功能
- Java学习之 -----动态编译
- python发送http请求之requests模块
- wordcount 代码解析
- registry 搭建
- springmvc(4)--注解的处理器映射器和适配器
- PHP5 扩展对象
- 跨文档消息传递XDM
- 实现线程的两种方式
- 解决安卓手机H5页面input获得焦点时页面挤压或者底部上移