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