博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bsh(BeanShell)动态执行java代码
阅读量:3575 次
发布时间:2019-05-20

本文共 2880 字,大约阅读时间需要 9 分钟。

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

(1)如果使用普通的工程,到进行下载,加入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()

这里写图片描述

通常使用:

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
> 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
>());
你可能感兴趣的文章
温湿度传感器(AM2312)
查看>>
抖音无水印视频下载,不用借助第三方网站【详细教程】
查看>>
推荐几款好用的Chrome插件,码农的利器。
查看>>
sql 数据库的优化【经验贴】
查看>>
一篇认识 Zookeeper
查看>>
一篇认识kafka
查看>>
Kafka 实战
查看>>
一篇认识 Elasticsearch
查看>>
爬虫篇——腾讯新闻的详细采集过程(列表新闻和新闻内容)
查看>>
NIO 服务器端不阻塞的一个Bug解决
查看>>
DM数据库的安装部署和卸载
查看>>
DM8数据库体系结构
查看>>
DM模式对象的基本操作
查看>>
事件和几个JavaScript实例
查看>>
jQuery基本介绍(和js关系)
查看>>
jQuery选择器和API方法介绍
查看>>
汇编预习三周速成85分之寄存器
查看>>
jQuery对ajax的封装部分详解和案例
查看>>
hibernate简单介绍
查看>>
\hibernate核心配置和映射文件
查看>>