我们知道,在很多脚本语言中都有eval涵数,它可以把字符串转换为表态式并执行.如在javaScript中
var str = aid.value + ".style.top = 10;"
把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是"axman",则
str = "axman.style.top = 10"
现在我们要让控制axman移动到顶部为10的位置:
eval(str);
这样这个字符串就变成了表达式或语句开始执行.这样的功能对于动态构造变量是有非常重要的
意义.
那么在java中,如果实现这个功能呢?其实我们可以用动态编译来实现:
假设有一组方法实现不同的功能,现在要根据传进来的方法名调用相应的方法,假如没有eval功能,我们
只能这么做:
MyClass mc = new MyClass();
if(str.equals("m1"))
mc.m1();
else if(str.equals("m1"))
mc.m2();
else if(str.equals("m3"))
mc.m3();
else if(.........)
.........();
如果有一百种情况呢?
如果我们用eval方法就可以直接这样:
String str = ...........;
eval("mc"+str+"();");
是不是非常方便?关键是如何实现eval()?
经过几个小时的网上搜索和研究终于找到了方法,现在拿出来和大家分享下
接着运行以下程序即可看到效果
import bsh.Interpreter;
import java.util.*;
public class testBshInterpreter
{
public static void main(String args[]) throws Exception
{
Interpreter interpreter= new Interpreter();
//String bStr="(100>50 && 100<101)";
try
{
//1
interpreter.set("add", interpreter.eval("(100+101)"));
System.out.println(interpreter.get("add"));
interpreter.set("boolean", interpreter.eval("(100>101)"));
System.out.println(interpreter.get("boolean"));
//2
Interpreter i = new Interpreter(); // Construct an interpreter
i.set("foo", 5); // Set variables
i.set("date", new Date() );
Date date = (Date)
i.get("date"); // retrieve a variable
// Eval a statement and get the result
i.eval("bar = foo*10");
System.out.println( i.get("bar") );
String[] s ={"getname","getname1"};
for(int j=0;j
i.eval("result = testBshInterpreter."+s[j]+"()");
System.out.println(i.get("result"));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static String getname(){
return "haha";
}
public static String getname1(){
return "HOHO";
}
}
说明:此程序大部分是从网上COPY来,本人主要写了2个方法和System.out.println(i.get("result"));
的这部分,也是我在做程序时所遇到的一个难题,原来想的办法是和一开始写的方法一样,但觉得太复杂且运行效率不高,便开始寻找解决方法,虽然话了几个小时,可是还是比较值的
显示结果为:
201
false
50
haha
HOHO