zoukankan      html  css  js  c++  java
  • 使用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();
      }

     }

    }


  • 相关阅读:
    前端开发和网页设计的过去和未来
    Web开发人员vs网页设计师
    Linux最终将会领先于Windows、Mac OS!
    Linux 大爆炸:一个内核,无数发行版
    因PHP漏洞,超过4.5万个中国网站被攻击
    在 Linux 中自动配置 IPv6 地址
    echart-折线图,数据太多想变成鼠标拖动和滚动的效果?以及数据的默认圈圈如何自定义圆圈的样式
    用TweenMax.js动画让数字动起来
    zrender笔记----(数字Number组件)出现的问题和解决办法
    面试题常考&必考之--js中的数组去重和字符串去重
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696779.html
Copyright © 2011-2022 走看看