今天项目中遇到一个问题,需要根据一段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/archive/2012/10/15/5696780.html

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

  1. python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...

    本文实例讲述了Python解析json时提示"string indices must be integers"问题解决方法.分享给大家供大家参考,具体如下: import json ...

  2. JDK源码解析之 Java.lang.String

    String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...

  3. java的String构造对象的几种方法以及内存运行过程

    String类创建对象的方法可以分为以下三种 1.String a = "123"; 2.String b = new String("123"); 3.Str ...

  4. Java之String类

    2019独角兽企业重金招聘Python工程师标准>>> ‍String类‍ 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java ...

  5. java中string类_Java中String类浅谈

    1)String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:      String s = "abc&qu ...

  6. 为什么不能自定义java.lang.String

    如果直接写一个java.lang.String类,并写一个main方法,即 package java.lang;public class String {public static void main ...

  7. java把string转换为int_java如何把String类型转换为int类型

    在java中,实现String类型转换为int类型的方法有:Integer.parseInt(String)方法.Integer.valueOf(String)方法. 本篇文章就给大家介绍java把S ...

  8. java把string转int类型_java把String类型转换为int类型的方法

    java把String类型转换为int类型的方法 发布时间:2020-08-20 14:32:03 来源:亿速云 阅读:73 作者:小新 这篇文章将为大家详细讲解有关java把String类型转换为i ...

  9. mybatis报错解决办法 :Result Maps collection does not contain value for java.lang.String

    错误 java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.lang.S ...

最新文章

  1. PCB的EMC设计之PCB叠层结构
  2. R语言使用broom包将回归模型(线性回归、逻辑回归、比例风险回归)的结果整理成dataframe并导出到excel等文件中:基于mtcars和colon数据集
  3. Eclipse中配置Tomcat
  4. CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)
  5. keras实现嘴唇图像autoencoder
  6. springmvc通过@Value注解读取Properties配置文件的值,junit测试可以取到值,但是在业务中无法读取
  7. 23种设计模式(3)-原型模式
  8. 使用PowerDesigner进行面向对象分析与UML建模(转)
  9. Winform获取本地IP和外网IP
  10. go对get、post请求封装
  11. 小程序中添加客服按钮contact-button
  12. 浪潮笔试c语言答案,【浪潮集团员工笔试试题及答案】 - 面试网
  13. win7用计算机名共享打印机,WIN7共享打印机 可以同时多少台电脑共享一台打印机-win7一键共享打印机,win7一键共享工具软件...
  14. CAD制图中该怎么查找文字呢?
  15. WINRAR5.0破解
  16. 虾米音乐穷X事件程序员怎么样呢?
  17. Web项目之服务器、客户端存储
  18. [数据结构]头插法与尾插法
  19. 不太吸引人的成就系统
  20. LVGL 8.2.0 Stacked area chart

热门文章

  1. 2.10 是否要使用端到端的深度学习
  2. Pandas Apply函数
  3. android calendarview 单月显示博客,android CalendarView
  4. 一项一项教你测等保2.0——Windows入侵防范
  5. Kubernetes学习总结(2)——Kubernetes设计架构
  6. mysql alter atafter_MySQL 常用操作
  7. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的
  8. css帧动画点击执行一次_CSS动画深入浅出
  9. Centos 7安装RabbitMQ 3.7.8版本(单机版)-不使用RPM
  10. Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法