|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。编译|静态我们晓得,在良多剧本言语中都有eval涵数,它能够把字符串转换为亮相式并实行.如在javaScript中
varstr=aid.value+".style.top=10;"
把一个id为"aid"的把持的值掏出来加兼并成一个字符串,假如aid的值是"axman",则
str="axman.style.top=10"
如今我们要让把持axman挪动到顶部为10的地位:
eval(str);
如许这个字符串就酿成了表达式或语句入手下手实行.如许的功效关于静态机关变量是有十分主要的
意义.
那末在java中,假如完成这个功效呢?实在我们能够用静态编译来完成:
假定有一组办法完成分歧的功效,如今要依据传出去的办法名挪用响应的办法,假设没有eval功效,我们
只能这么做:
MyClassmc=newMyClass();
if(str.equals("m1"))
mc.m1();
elseif(str.equals("m1"))
mc.m2();
elseif(str.equals("m3"))
mc.m3();
elseif(.........)
.........();
假如有一百种情形呢?
假如我们用eval办法就能够间接如许:
Stringstr=...........;
eval("mc"+str+"();");
是否是十分便利?关头是怎样完成eval()?
我们把要转换的字符串机关一个完全的类:假如办法是有前往值的.则:
publicObjecteval(Stringstr){
//天生java文件
Strings="classTemp{";
s+="Objectrt(){"
s+="MyClassmc=newMyClass();"
s+="returnmc."+str+"();";
s+="}"
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(cpargs);
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[]{newString[0]});
//假如办法没有前往就间接挪用
}
我们能够先写很多多少个重载的eval,有前往值和没有前往值的.和能够传送参数的.
如许我们就能够用字符串转换为java的语句来实行.
本文只是一个例子,申明了一个静态编译的头脑,更好的完成请列位伴侣本人来完成.
前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。 |
|