Beanshell是轻量级的java 脚本语言。
官方主页http://www.beanshell.org, 通过简介我们可以看到使用beanshell可以给我们基于java的程序增加动态编程功能。 下面就给出几个示例。
1, 通过BSFManager
如下例子我们可以看到首先给脚本增加2两个变量,第一个是类型为Integer的var1, 第二个是当前时间,类型为Date。 然后String var1 = var1 + “_” + date.toString(); 返回var1的值。
import java.util.Date;
import org.apache.bsf.BSFException;
import org.apache.bsf.BSFManager;
public class BeanShellManagerDemo {
public static void main(String[] args) {
BSFManager mgr = new BSFManager();
try {
// Set variables
mgr.declareBean("var1", 5, Integer.class);
mgr.declareBean("date", new Date(), Date.class);
String script = "import java.util.Date;"
+" String var1 = var1 + \"_\" + date.toString();"
+" return var1";
Object result = mgr.eval("beanshell", "no", 0, 0, script);
System.out.println("source result:" + result);
}
catch (BSFException ex) {
ex.printStackTrace();
}
}
}
运行结果为source result:5_Mon Aug 08 22:45:18 CST 2016。 注意具体时间会变化的。
第二种,使用Interpreter。
与第一种情况类似,我们首先设置了两个变量var1和date,然后获取date,已经对var1进行运算。 后面我们加载了demo.bsh文件,这是个文本文件。内容为return var1 + “_abc”;
import java.io.IOException;
import java.util.Date;
import bsh.EvalError;
import bsh.Interpreter;
public class beanshell {
/**
* @param args
*/
public static void main(String[] args) {
Interpreter i = new Interpreter(); // Construct an interpreter
try {
// Set variables
i.set("var1", 5);
i.set("date", new Date() );
Date date = (Date)i.get("date");
System.out.println("CurrentDate:" + date );
// Eval a statement and get the result
i.eval("bar = var1*10");
// retrieve a variable
System.out.println( i.get("bar") );
// Source an external script file
try {
Object obj = i.source("demo.bsh");
System.out.println( "source result:" + obj);
}
catch ( IOException e) {
e.printStackTrace();
}
}
catch (EvalError e) {
e.printStackTrace();
}
}
}
最终运行结果为:
CurrentDate:Mon Aug 08 22:49:28 CST 2016
50
source result:5_abc
注意:通过测试发现,使用BSFManager,脚本的容错性更高,比如当使用BSFManager,script内容为“qqqqqqxxxx”也不或发生异常,但是如果使用Interpreter和load就直接报错了。
我使用的是bsh-2.0b4.jar