使用beanshell实现JAVA代码动态运行

今天有个童鞋问个问题,就是如何将一个计算表达式转成数字,如一个字符串"1+2+3*4",需要计算这个串的值。如果这个问题在javascript中,就很简单了,用一个eval方法就搞定。java是否也有类似的方法,答案是有的,用beanshell这个第三方包就有类似的eval 方法,步骤如下:

1、下载beanshell的jar包,我本机的是:bsh-1.3.0.jar ,估计版本有点老,不过没问题;

2、编写如下代码:

import bsh.Interpreter;

public class TestBeanShell {
public static void main(String[] args) throws Exception {
//待计算的表达式,将计算结果赋值给outValue
String evalString = "outValue = (1+2+3*4)/5;";

//调用beanshell进行计算
Interpreter interpreter = new Interpreter();
interpreter.eval(evalString);

//打印计算结果
System.out.println(((Integer) interpreter.get("outValue")).intValue());
}
}

3、以上的例子是很简单的,实际上beanshell能做的事情比这个多多了,以下是稍微复杂点的例子,包含输入参数,然后根据输入参数进行计算:

import bsh.Interpreter;

public class TestBeanShell2 {
public static void main(String[] args) throws Exception {
//待计算的表达式,将计算结果赋值给outValue
String evalString = "outValue = inValue * (1+2+3*4)/5;";

//调用beanshell进行计算
Interpreter interpreter = new Interpreter();
//设置输入参数:
interpreter.set("inValue", new Integer(4));
interpreter.eval(evalString);

//打印计算结果
System.out.println(((Integer) interpreter.get("outValue")).intValue());
}
}

4、写个更复杂的,将一段java代码写到一个文本文件,然后调用beanshell执行:

首先创建一个文本文件testScript.txt ,在这个文本文件里写上符合JAVA规范的任何文本,我的例子如下:

private long getTime(){
return System.currentTimeMillis();
}
outValue = getTime();
System.out.println(outValue);

第二步,使用beanShell执行这个testScript.txt

import bsh.Interpreter;

public class TestBeanShell3 {
public static void main(String[] args) throws Exception {

Interpreter interpreter = new Interpreter();

interpreter.set("inValue", new Integer(4));
interpreter.source("c:/testScript.txt");

//打印计算结果
System.out.println(((Long) interpreter.get("outValue")).longValue());

}
}

5、总结:beanShell实际上还有很多其它功能,这里不一一列举;

6、引申:如果要你用纯java实现一个类似beanShell的功能,你能实现吗?实际要让我实现,我觉得也很easy,用一个自定义classloader,在loader里头动态编译java文件,然后动态load编译后的class进来再执行,也可以完全实现类似的功能,在后续的博文中我将描述这一个实现过程。

7、附加,如果你感兴趣,javaassist也很强大,要实现上述的功能也很easy.

你可能感兴趣的:(java,beanShell,动态运行)