使用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/archive/2012/10/15/5696780.html
使用beanShell来解析执行java的String方法,类似javascipt的eval方法相关推荐
- python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...
本文实例讲述了Python解析json时提示"string indices must be integers"问题解决方法.分享给大家供大家参考,具体如下: import json ...
- JDK源码解析之 Java.lang.String
String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...
- java的String构造对象的几种方法以及内存运行过程
String类创建对象的方法可以分为以下三种 1.String a = "123"; 2.String b = new String("123"); 3.Str ...
- Java之String类
2019独角兽企业重金招聘Python工程师标准>>> String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java ...
- java中string类_Java中String类浅谈
1)String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "abc&qu ...
- 为什么不能自定义java.lang.String
如果直接写一个java.lang.String类,并写一个main方法,即 package java.lang;public class String {public static void main ...
- java把string转换为int_java如何把String类型转换为int类型
在java中,实现String类型转换为int类型的方法有:Integer.parseInt(String)方法.Integer.valueOf(String)方法. 本篇文章就给大家介绍java把S ...
- java把string转int类型_java把String类型转换为int类型的方法
java把String类型转换为int类型的方法 发布时间:2020-08-20 14:32:03 来源:亿速云 阅读:73 作者:小新 这篇文章将为大家详细讲解有关java把String类型转换为i ...
- 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 ...
最新文章
- python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题
- iOS10 UI教程基础窗口的内容与设置起始窗口
- 【推荐系统】推荐系统中的排序学习
- JAVA用JComboBox_java JCombobox和JList的使用
- openssh登陆时提示服务器拒绝了密码
- mysql操作库命令_MYSQL数据库------操作命令笔记
- C---队列,栈的实现
- python双循环_双for循环到Python列表理解
- 图邻接表拓扑排序算法c语言完整,在用邻接表表示图时,拓扑排序算法时间复杂度为()...
- 乱码转换器在线转换_有了这几款视频下载转换软件,想看的视频都可以随意看了...
- 计算机技术发展5大阶段,现阶段计算机技术应用及发展
- python与图像处理书籍_数字图像处理与Python实现
- Codeforces1538G Gift Set (三分)
- 逼自己一把,你就优秀了
- 空间直线的最小二乘拟合
- 【FFMPEG】H264码流的两种组织方式:AnnexB和AVCC
- qrcode.js生成微信二维码
- python html 中文 编码,如何用Python将HTML非ASCII数据编码为UTF-8
- Java Web实用开发技术(4)------在线编辑器
- python之pythonnet
热门文章
- TensorFLow RCNN
- Pandas 通用方法
- java 类里面对象共享_Java并发编程 - 对象的共享
- python3操作excel(xls与xlsx版本的爱恨情仇)
- java for 面试题_Java面试题整理
- Exchange Reporter Plus概述
- Windows update一直停留在正在检查更新,为什么
- 支付业务与技术架构学习总结(8)——支付系统设计包含:账户,对账,风控...
- Spring Boot学习总结(19)——使用Redisson实现分布式锁
- 敏捷开发系列学习总结(17)——团队需要Scrum Master做这六件事