在java中利用动态编译实现eval

在java中利用动态编译实现eval

ID:8839377

大小:27.50 KB

页数:3页

时间:2018-04-09

在java中利用动态编译实现eval_第1页
在java中利用动态编译实现eval_第2页
在java中利用动态编译实现eval_第3页
资源描述:

《在java中利用动态编译实现eval》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、我们知道,在很多脚本语言中都有eval函数,它可以把字符串转换为表达式并执行.如在javaScript中:varstr=aid.value+".style.top=10;"  把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是"axman",则str="axman.style.top=10"  现在我们要让控制axman移动到顶部为10的位置:eval(str);  这样这个字符串就变成了表达式或语句开始执行.这样的功能对于动态构造变量是有非常重要的意义.  那么在java中

2、,如果实现这个功能呢?其实我们可以用动态编译来实现。动态编译实现eval  假设有一组方法实现不同的功能,现在要根据传进来的方法名调用相应的方法,假如没有eval功能,我们只能这么做:MyClassmc=newMyClass();if(str.equals("m1"))mc.m1();elseif(str.equals("m1"))mc.m2();elseif(str.equals("m3"))mc.m3();elseif(.........).........();  如果有一百种情况呢?  如果

3、我们用eval方法就可以直接这样:Stringstr=...........;eval("mc"+str+"();");  是不是非常方便?关键是如何实现eval()?  我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:publicObjecteval(Stringstr){//生成java文件Strings="classTemp{";s+="Objectrt(){"s+="MyClassmc=newMyClass();"s+="returnmc."+str+"();";s+="}"

4、s+="}";Filef=newFile("Temp.java");PrintWriterpw=newPrintWriter(newFileWriter(f));pw.println(s);pw.close();//动态编译com.sun.tools.javac.Mainjavac=newcom.sun.tools.javac.Main();String[]cpargs=newString[]{"-d","所在目录","Temp.java"};intstatus=javac.compile(cpar

5、gs);if(status!=0){System.out.println("没有成功编译源文件!");returnnull;}//调用Temp的rt方法返回结果:MyClassLoadermc=newMyClassLoader();Classclasz=mc.loadClass("Test.class",true);Methodrt=clasz.getMethod("rt",newClass[]{String[].class});returnrt.invoke(null,newObject[]{ne

6、wString[0]});//如果方法没有返回就直接调用}  我们可以先写好多个重载的eval,有返回值和没有返回值的.以及可以传递参数的.  这样我们就可以用字符串转换为java的语句来执行.  本文只是一个例子,说明了一个动态编译的思想,更好的实现请各位朋友自己来完成.  后记:关于动态编译的参数,补充说明一下:String[]cpargs=newString[]{"-d","所在目录","Temp.java"};  -d指明的目录应该是当前目录,因为生成的java文件是以当前目录为"/"然后在

7、此目录下建立相应的包的."当前目录"应该用newFile(".").getAbsoultPath()来确定.  java文件如果有package,在生成的时候应该建立相应的子目录.而这个参数应该是java源文件的file对象的getAbsoultPath(),如当前应用程序是在d:debug目录运行,动态生成的java文件有个package为temp;  则String[]cpargs=newString[]{"-d","d:\debud","d:\debug\temp\Temp.java

8、"};这样生成的class文件应该和java源文件在同一目录d:debug\temp下.  重载loadClass方法时应该注意能正确读取到class文件

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。