阳江便利店转让:在java中利用动态编译实现eval

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 23:33:14

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

分类: java 2007-10-30 15:50

我们知道,在很多脚本语言中都有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()?

经过几个小时的网上搜索和研究终于找到了方法,现在拿出来和大家分享下

首先你要到http://www.beanshell.org/download.html去下载个BeanShell的一个包,我下的是bsh-2.0b4.jar ,然后在ClassPath中将它的地址写上.

接着运行以下程序即可看到效果

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