bsh(BeanShell)动态执行java代码
来源:互联网 发布:小米6陶瓷版 知乎 编辑:程序博客网 时间:2024/06/07 00:31
(一)BeanShell(bsh-core)下载与引入
(1)如果使用普通的工程,到http://www.beanshell.org/download.html进行下载,加入lib
(2)maven工程在pom.xml引入
<dependency> <groupId>org.beanshell</groupId> <artifactId>bsh-core</artifactId> <version>2.0b4</version> </dependency>
(二)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()
通常使用:
Object o=interpreter.eval(str);
eval返回值为Object,可以通过eval()求文本表达式的值或者运行脚本;
如:
interpreter.eval("import java.util.*;");//引入utilinterpreter.eval("import com.xxx.function.*;");//引入自己的function包
interpreter.eval("Test.getName()");//执行Test类的getName()方法
(2) set()
set()方法传递对象的变量参数给BeanShell
如:
将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<HashMap<String,String>> inMap=new ArrayList<HashMap<String,String>>();");for(HashMap<String, String> inm:list){ interpreter.set("m", new HashMap<String,String>()); for (Entry<String, String> 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<HashMap<String,String>> inMap=new ArrayList<HashMap<String,String>>();");
修改为
interpreter.set("inMap",new ArrayList<HashMap<String,String>>());
0 0
- bsh(BeanShell)动态执行java代码
- atitit.bsh BeanShell 的动态脚本使用java
- BeanShell(bsh)介绍及安装
- spring动态执行语言beanshell
- BSH--Java Shell,Java也执行脚本语言
- java中动态执行一段代码
- Java reflect--动态执行Method-代码
- jmeter 使用BeanShell编写java代码提取请求参数
- Java脚本-BeanShell
- C#动态执行代码
- C#动态执行代码
- C# 动态代码执行
- C# 动态代码执行
- 动态执行代码
- C#动态执行代码
- 动态编译执行代码
- 动态执行python代码
- java命令解释器介绍-bsh
- A+B for Input-Output Practice (I)
- 保护视力,从改变eclipse编辑器样式风格做起
- 三维排序(将书以Name、Year、Price进行排序
- hdu1241 Oil Deposits
- SPSS 文本值在当前服务器区域不可映射解决办法
- bsh(BeanShell)动态执行java代码
- crontab设置脚本环境变量
- poj 1741 点分治论文题
- c#单例模式的简单学习
- 啥?
- 通过MathJax在页面上显示微积分等数学公式
- 深度学习之DBN(一)
- IntelliJ IDEA常用设置/操作
- Div的换行样式