java bsh 性能_bsh(BeanShell)动态执行java代码

(一)BeanShell(bsh-core)下载与引入

(1)如果使用普通的工程,到http://www.beanshell.org/download.html进行下载,加入lib

(2)maven工程在pom.xml引入

org.beanshell

bsh-core

2.0b4

(二)bsh使用范例

先通过两个例子来建立一下感性的认识

(1)如下代码执行了1>2;返回值为false;

Interpreter interpreter = new Interpreter();

String s = "1>2;";

try {

Object object=interpreter.eval(s);

System.out.println(object.toString());

} catch (EvalError e) {

e.printStackTrace();

}

(2) 如下代码打印出”hello”

Interpreter interpreter = new Interpreter();

String s = "return \"hello\"";

try {

Object object=interpreter.eval(s);

System.out.println(object.toString());

} catch (EvalError e) {

e.printStackTrace();

}

在这里需要介绍一下bsh的几个常用的方法:

(1)eval()

35a7bb557ce227819f028a5b35eb9386.png

通常使用:

Object o=interpreter.eval(str);

eval返回值为Object,可以通过eval()求文本表达式的值或者运行脚本;

如:

interpreter.eval("import java.util.*;");//引入util

interpreter.eval("import com.xxx.function.*;");//引入自己的function包

interpreter.eval("Test.getName()");//执行Test类的getName()方法

(2) set()

set()方法传递对象的变量参数给BeanShell

fadb923704abf6c868fefdb4a4e34e29.png

如:

将new Date().getTime()赋值给date

interpreter.set("date", new Date().getTime());

将10赋值给now

interpreter.set("now", 10);

Interpreter interpreter = new Interpreter();

try {

interpreter.set("date", new Date().getTime());

interpreter.set("now", 10);

Object object=interpreter.eval("return date*now;");

System.out.println(object.toString());

} catch (EvalError e) {

e.printStackTrace();

}

(3)get()

通过get()方法去取得BeanShell中的变量

interpreter.get("date")

(3)some error

之前有一个项目遇到一个问题,先上代码:

Interpreter interpreter = new Interpreter();

interpreter.eval("import java.util.*;");

interpreter.eval("import com.xxx.function.*;");

interpreter.eval("List> inMap=new ArrayList>();");

for(HashMap inm:list){

interpreter.set("m", new HashMap());

for (Entry entry : inm.entrySet()){ interpreter.eval("m.put(\""+entry.getKey().toString()+"\",\""+entry.getValue().toString()+"\");");

}

interpreter.eval("inMap.add(m);");

interpreter.eval("Test.filter(inMap);");

}

运行之后发现出现这样的错误:

Exception in thread "main" Parse error at line 1, column 20. Encountered: ,

at bsh.Parser.generateParseException(Unknown Source)

at bsh.Parser.jj_consume_token(Unknown Source)

at bsh.Parser.Statement(Unknown Source)

at bsh.Parser.BlockStatement(Unknown Source)

at bsh.Parser.Line(Unknown Source)

at bsh.Interpreter.Line(Unknown Source)

at bsh.Interpreter.eval(Unknown Source)

at bsh.Interpreter.eval(Unknown Source)

at bsh.Interpreter.eval(Unknown Source)

......

后来才发现bsh对有些符号是有限制的,上面的代码完全可以这样:

interpreter.eval("List> inMap=new ArrayList>();");

修改为

interpreter.set("inMap",new ArrayList>());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值