表达式语言引擎:Apache Commons JEXL 2.1 发布
http://www.linuxde.net/2011/12/4348.html
Commons JEXL 2.1 发布了,该版本和 2.0.1 是二进制兼容的,但源码不兼容,因为新增了两个接口:
org.apache.commons.jexl2.Script
org.apache.commons.jexl2.JexlInfo
JEXL 2.1 改进内容:
A more thorough arithmetic (JexlArithmetic) that allows fine control over decimals (scale and precision), a new syntax for numeric literals (OGNL inspired Big and Huge notations) and a better type handling keeping the most appropriate representation in casual operations.
The introduction of script variables and parameters that reduce context dependencies and methods; this allows to perform checks after script creation (light static checking hints). Plus the ability to call script from scripts.
A sandoxing feature to restrict and rename what JEXL can access from the environment allowing tighter control over security.
Extensions to UnifiedJEXL that allow the creation of templates.
完整记录请看:http://commons.apache.org/jexl/changes-report.html#a2.1
JAVA Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不时 JSTL 中的表达式语言的实现。
下载地址:http://commons.apache.org/jexl/download_jexl.cgi
java实现字符串转换成可执行代码
1. http://wiselyman.iteye.com/blog/1677444
2. http://blog.5ibc.net/p/51238.html
使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:
- import java.util.Map;
- import org.apache.commons.jexl2.Expression;
- import org.apache.commons.jexl2.JexlContext;
- import org.apache.commons.jexl2.JexlEngine;
- import org.apache.commons.jexl2.MapContext;
- /**
- * 动态加载方法
- * @author wangyfc
- *
- */
- public class DyMethodUtil {
- public static Object invokeMethod(String jexlExp,Map<String,Object> map){
- JexlEngine jexl=new JexlEngine();
- Expression e = jexl.createExpression(jexlExp);
- JexlContext jc = new MapContext();
- for(String key:map.keySet()){
- jc.set(key, map.get(key));
- }
- if(null==e.evaluate(jc)){
- return "";
- }
- return e.evaluate(jc);
- }
- }
调用方式:
- Map<String,Object> map=new HashMap<String,Object>();
- map.put("testService",testService);
- map.put("person",person);
- String expression="testService.save(person)";
- DyMethodUtil.invokeMethod(expression,map);
java 中使用jexl进行表达式判断http://hi.baidu.com/leezuu/item/2c98397843284a3c6e29f653
使用el在jsp中很方便,那么在java程序中如何实现表达式判断呢,jexl是个不错的选择
- package jexl.test;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.commons.jexl2.JexlContext;
- import org.apache.commons.jexl2.JexlEngine;
- import org.apache.commons.jexl2.MapContext;
- public class Tester {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 描述一个人,他有两条腿
- Map<String, Object> person=new HashMap<String, Object>();
- person.put("skinColor", "red"); // 皮肤为红色
- person.put("age", 23); // 年龄23
- person.put("cash", 60.8); // 身上有60.8元现金
- // 左腿定义
- Map<String, Object> leg1=new HashMap<String, Object>();
- leg1.put("leftOrRight", "left"); // 左腿
- leg1.put("length", 20.3); // 腿长多少
- leg1.put("hair", 3000); //有多少腿毛
- // 右腿定义
- Map<String, Object> leg2=new HashMap<String, Object>();
- leg2.put("leftOrRight", "right"); // 右腿
- leg2.put("length", 20.3); // 腿长多少
- leg2.put("hair", 3050); //有多少腿毛
- // 给他两条腿
- List<Map<String, Object> > legs=new ArrayList<Map<String, Object> >();
- legs.add(leg1);
- legs.add(leg2);
- person.put("leg",legs);
- // 让这个人变成一个Context,以便Jexl认识他
- JexlContext context = new MapContext(person);
- JexlEngine engine=new JexlEngine(); // 定义引擎, 1.1与2.1的用法不同,1.1使用的是工厂
- // 看看这个人是否年龄在30岁以上,并且身上有超过100元现金
- boolean yes=(Boolean)engine.createExpression( "age>30 && cash>100" ).evaluate(context);
- System.out.println("年龄在30岁以上,并且身上有超过100元现金? "+yes); // 他没有
- // 看看这个人是否左腿上有超过2500根汗毛
- yes=(Boolean)engine.createExpression( "leg[0].hair>2500" ).evaluate(context);
- System.out.println("左腿上有超过2500根汗毛? "+yes); // 是的,他有
- }
- }
结果打印如下
年龄在30岁以上,并且身上有超过100元现金? false
左腿上有超过2500根汗毛? true
表达式语言引擎:Apache Commons JEXL 2.1 发布的更多相关文章
- 一种表达式语言的解析引擎JEXL简单使用
Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...
- apache commons Java包简介
更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...
- 一篇关于apache commons类库的详解
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- Apache commons (Java常用工具包)简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- Apache commons(Java常用工具包)简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- 一篇关于apache commons类库的详解[转]
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- 转载:Apache commons开源工具简介
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...
- Apache Commons 简介
Apache Commons 由多个独立发布的软件包组成,此页面提供了当前可用的 Commons 组件的概述. Components BCEL 字节码工程库 - 分析,创建和操作 Java 类文件. ...
- apache commons类库的学习
原文地址http://www.tuicool.com/articles/iyEbquE 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默 ...
随机推荐
- 【ssh】端口转发
来源:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 非常非常好用,可以通过跳板解决两台服务器无法连接的问题 第一部分 概述 ...
- uva11426 欧拉函数应用,kuangbin的筛法模板
/* 给定n,对于所有的对(i,j),i<j,求出sum{gcd(i,j)} 有递推式sum[n]=sum[n-1]+f[n] 其中f[n]=gcd(1,n)+gcd(2,n)+gcd(3,n) ...
- Python使用正则表达式分割字符串
re.split(pattern, string, [maxsplit], [flags]) pattern:表示模式字符串,由要匹配的正则表达式转换而来. string:表示要匹配的字符串. max ...
- 原创 《算法》java第四版,标准输入
<算法>学习过程中,在eclipse里调试时,对于官方提供的源码中标准输入的操作,没有搞懂 自己改了一下,直接读取本地测试数据测试数据可在http://algs4.cs.princet ...
- Win10如何禁止软件运行?win10禁止软件启动的设置方法!禁止人生日历热点快讯的方法
相信不少使用Win10系统的用户遇到过下载了一款软件进行安装后后续会有接连不断的程序安装到电脑中.他可能似乎一个大家常用的程序,在我们安装好运行的时候会通过后台偷偷下载其他应用安装到我们电脑中,导致系 ...
- jquery表单提交的新写法
$('form').submit()和$("form").submit() 这两种都可以实现form表单的提交 jquery中$('form').submit()和$(" ...
- 免费API接口
网址:https://code.juhe.cn/ http://apistore.baidu.com/ http://blog.csdn.net/cc20032706/article/details/ ...
- Visual Studio 2017离线安装失败:安装程序清单签名验证失败
解决办法: 方法1:运行gpeidit.msc,然后 Windows 设置-安全设置->本地策略-安全选项-系统机密->将FIPS兼容算法用于加密.哈希和签名-设置禁用 方法2:删除vs ...
- 在WPF中获取DATAGRIDTEMPLATECOLUMN模板定义的内容控件(转载)
原文:http://www.cnblogs.com/eric_ibm/p/3772516.html xaml格式描述: <DataGrid Name="dataGrid" G ...
- 使用SecureCRT脚本备份网络设备配置的一点感悟
https://blog.csdn.net/qq_25294171/article/details/85158458