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

 今天项目中遇到一个问题,需要根据一段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();
  }

 }

}


原文地址:https://www.cnblogs.com/duyinqiang/p/5696778.html