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可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:

  1. import java.util.Map;
  2. import org.apache.commons.jexl2.Expression;
  3. import org.apache.commons.jexl2.JexlContext;
  4. import org.apache.commons.jexl2.JexlEngine;
  5. import org.apache.commons.jexl2.MapContext;
  6. /**
  7. * 动态加载方法
  8. * @author wangyfc
  9. *
  10. */
  11. public class DyMethodUtil {
  12. public static Object invokeMethod(String jexlExp,Map<String,Object> map){
  13. JexlEngine jexl=new JexlEngine();
  14. Expression e = jexl.createExpression(jexlExp);
  15. JexlContext jc = new MapContext();
  16. for(String key:map.keySet()){
  17. jc.set(key, map.get(key));
  18. }
  19. if(null==e.evaluate(jc)){
  20. return "";
  21. }
  22. return e.evaluate(jc);
  23. }
  24. }

调用方式:

  1. Map<String,Object> map=new HashMap<String,Object>();
  2. map.put("testService",testService);
  3. map.put("person",person);
  4. String expression="testService.save(person)";
  5. DyMethodUtil.invokeMethod(expression,map);

java 中使用jexl进行表达式判断http://hi.baidu.com/leezuu/item/2c98397843284a3c6e29f653 
使用el在jsp中很方便,那么在java程序中如何实现表达式判断呢,jexl是个不错的选择

  1. package jexl.test;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import org.apache.commons.jexl2.JexlContext;
  7. import org.apache.commons.jexl2.JexlEngine;
  8. import org.apache.commons.jexl2.MapContext;
  9. public class Tester {
  10. /**
  11. * @param args
  12. */
  13. public static void main(String[] args) {
  14. // 描述一个人,他有两条腿
  15. Map<String, Object> person=new HashMap<String, Object>();
  16. person.put("skinColor", "red");  // 皮肤为红色
  17. person.put("age", 23);   // 年龄23
  18. person.put("cash", 60.8);      // 身上有60.8元现金
  19. // 左腿定义
  20. Map<String, Object> leg1=new HashMap<String, Object>();
  21. leg1.put("leftOrRight", "left");  // 左腿
  22. leg1.put("length", 20.3);  // 腿长多少
  23. leg1.put("hair", 3000);  //有多少腿毛
  24. // 右腿定义
  25. Map<String, Object> leg2=new HashMap<String, Object>();
  26. leg2.put("leftOrRight", "right");  // 右腿
  27. leg2.put("length", 20.3);  // 腿长多少
  28. leg2.put("hair", 3050);  //有多少腿毛
  29. // 给他两条腿
  30. List<Map<String, Object> > legs=new ArrayList<Map<String, Object> >();
  31. legs.add(leg1);
  32. legs.add(leg2);
  33. person.put("leg",legs);
  34. // 让这个人变成一个Context,以便Jexl认识他
  35. JexlContext context = new MapContext(person);
  36. JexlEngine engine=new JexlEngine(); // 定义引擎, 1.1与2.1的用法不同,1.1使用的是工厂
  37. // 看看这个人是否年龄在30岁以上,并且身上有超过100元现金
  38. boolean yes=(Boolean)engine.createExpression( "age>30 && cash>100" ).evaluate(context);
  39. System.out.println("年龄在30岁以上,并且身上有超过100元现金?  "+yes);  // 他没有
  40. // 看看这个人是否左腿上有超过2500根汗毛
  41. yes=(Boolean)engine.createExpression( "leg[0].hair>2500" ).evaluate(context);
  42. System.out.println("左腿上有超过2500根汗毛?  "+yes);   // 是的,他有
  43. }
  44. }

结果打印如下 
年龄在30岁以上,并且身上有超过100元现金?  false 
左腿上有超过2500根汗毛?  true

表达式语言引擎:Apache Commons JEXL 2.1 发布的更多相关文章

  1. 一种表达式语言的解析引擎JEXL简单使用

    Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...

  2. apache commons Java包简介

    更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...

  3. 一篇关于apache commons类库的详解

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  4. Apache commons (Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  5. Apache commons(Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  6. 一篇关于apache commons类库的详解[转]

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  7. 转载:Apache commons开源工具简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  8. Apache Commons 简介

    Apache Commons 由多个独立发布的软件包组成,此页面提供了当前可用的 Commons 组件的概述. Components BCEL 字节码工程库 - 分析,创建和操作 Java 类文件. ...

  9. apache commons类库的学习

    原文地址http://www.tuicool.com/articles/iyEbquE 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默 ...

随机推荐

  1. react native 打包Ignoring return value of function declared with warn_unused_result attribute

    从 github上下载 项目 用于学习查看别人的代码, 当执行完npm install  用xcode 打开 发现俩个错误提示Ignoring return value of function dec ...

  2. exec与match方法的区别

    http://www.cnblogs.com/xiehuiqi220/archive/2008/11/05/1327487.html var someText= "web2.0 .net2. ...

  3. 使用Navicat快速生成数据库字典

    https://blog.csdn.net/maquealone/article/details/60764420

  4. burpsuite使用教程和实战详解(一)

    1.最近做渗透测试,其实使用一种方式很难全面的对一个web或者app等安全服务器做安全评估,所以要尽可能的对网络安全的渗透测试有一个较全面的认知.不光要熟悉前端和 后天的编程,还有掌握基于这两种编程的 ...

  5. Metasploit 使用后门和Rootkit维持访问

    1.内存攻击指的是攻击者利用软件的漏洞,构造恶意的输入导致软件在处理输入数据时出现非预期的错误,将输入数据写入内存中的某些敏感位置,从而劫持软件控制流,转而执行外部的指令代码,造成目标系统获取远程控制 ...

  6. springboot动态多数据源切换

    application-test.properties #datasource -- mysql multiple.datasource.master.url=jdbc:mysql://localho ...

  7. 论文阅读笔记三十八:Deformable Convolutional Networks(ECCV2017)

    论文源址:https://arxiv.org/abs/1703.06211 开源项目:https://github.com/msracver/Deformable-ConvNets 摘要 卷积神经网络 ...

  8. C#学习-方法

    方法是由方法签名和一系列语句的代码块组成. 其中方法签名包括方法的访问级别(比如public或private).可修饰符(例如abstract关键字).方法名称和参数. C#也支持方法重载.方法重载指 ...

  9. react-native-video

    <Video ref='videoPlayer' source={{uri:'http://www.thinktown.com/video/th.mp4'}} //网络视频 //source={ ...

  10. [转]CR, LF, CR/LF区别与关系

    http://weizhifeng.net/talking-about-cr-lf.html 前言 在文本处理中,CR(Carriage Return),LF(Line Feed),CR/LF是不同操 ...