您的位置:首页 > 运维架构 > Shell

使用beanShell来解析执行java的String方法,类似javascipt的eval方法

2012-10-15 12:09 495 查看
今天项目中遇到一个问题,需要根据一段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 block

e.printStackTrace();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: