使用beanShell来解析执行java的String方法,类似javascipt的eval方法
来源:互联网 发布:python视频公开课 编辑:程序博客网 时间:2024/05/17 00:08
今天项目中遇到一个问题,需要根据一段String表达式的运算结果来决定后续执行的分支,表达式为动态的,具体实现时,为传入一些参数只想该表达式,表达式返回一个结果,对结果进行判断最终决定分支。一开始没啥思路。经过baidu和google的学习之后,发现beanShell可以很完美的解决该问题。故写在这里,希望可以帮助遇到同样问题的童鞋们,同时也作为记录免得自己后续给忘记了。
首先引入beanshell的jar包。下载网址为http://www.beanshell.org/download.html 当前最新版本为bsh-2.0b4.jar, 首先创建BshUtils 工具类
package com.freefly.utils.bsh;import java.util.*;import bsh.*;import org.apache.log4j.*;/** * <p> * Title: BshUtils * </p> * <p> * Description: beanshell工具类 * </p> * * @author 自由飞翔 * @version 1.0 */public final class BshUtils {private static Logger logger = Logger.getLogger(BshUtils.class);private Interpreter bsh = null;public BshUtils() {bsh = new Interpreter();}public Interpreter getBsh() {return bsh;}public final Object eval(String expr, Map varMap) throws Exception { Object obj = null; if (varMap == null || null == expr || "".equals(expr)){ return null; } Iterator it = varMap.keySet().iterator(); try { while (it.hasNext()) { String key = (String) it.next(); Object value = varMap.get(key); setValue(key, value); } obj = bsh.eval(expr); //返回变量 return obj; } catch (Exception ex) { logger.error(ex); throw ex; } }// 变量赋值private void setValue(String key, Object value) throws EvalError {if (value instanceof Boolean) {bsh.set(key, ((Boolean) value).booleanValue());} else if (value instanceof Byte) {bsh.set(key, ((Byte) value).byteValue());} else if (value instanceof Character) {bsh.set(key, ((Character) value).charValue());} else if (value instanceof Short) {bsh.set(key, ((Short) value).shortValue());} else if (value instanceof Integer) {bsh.set(key, ((Integer) value).intValue());} else if (value instanceof Long) {bsh.set(key, ((Long) value).longValue());} else if (value instanceof Float) {bsh.set(key, ((Float) value).floatValue());} else if (value instanceof Double) {bsh.set(key, ((Double) value).doubleValue());} else {bsh.set(key, value);}}}
接下来就是调用、测试了,简单的 支持四则运算以及java内置方法,能否支持自定义javabean方法,有待研究
public class BshTest {public static void main(String[] args) {BshUtils bsh = new BshUtils();String expr = "a==1&&b.equals(\"c\")";String expr2 = "a+c";Map<String, Object> map = new HashMap<String, Object>();map.put("a", 1);map.put("b", "c");map.put("c", 2);try {System.out.println("--------expr--------------> "+ bsh.eval(expr, map).toString());System.out.println("--------expr2--------------> "+ bsh.eval(expr2, map).toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
- 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
- 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
- 使用eval函数来解析json对象,并且使用jquery的each方法来遍历
- jemter使用beanshell的几种方法
- Beanshell 调用自己的方法
- js eval方法解析java后台传来的json字符串
- c#中实现类似js的Eval方法(2011-03
- Java 解析 Json 文件 (把 Json 转化成 String 的方法来解析)
- 关于使用Java去使用javascript的eval方法
- JavaScript的eval()方法的使用
- <%#Eval() %>的常用方法
- ruby中eval方法的使用
- 关于js里eval()方法的使用
- js中eval方法的使用
- 让eval()全局作用域执行的方法深入研究
- Java中通过String来动态的调用方法
- beanshell的使用
- Bind()方法与Eval()方法的区别与使用
- 警惕:黑客利用软件攻击达沃斯参与者
- 【黑马程序员】张孝祥Java高新技术_装箱拆箱、枚举、反射
- tc2.0环境下的C语言研究-简单使用寄存器并打印函数的偏移地址
- 运行启动命令
- Eclipse和PyDev搭建Python开发环境(Windows篇)
- 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
- iOS 越狱者的故事
- 帮你的云技术找到适合的保护
- Android Activity和Intent机制学习笔记
- 2012年1月微软MVP申请开始!
- python几点要特别注意! -- 不断更新中
- 1
- 开源RBAC产品的利与弊
- 银行卡卡号检验位