MVEL是一个功能强大的基于Java应用程序的表达式语言。
目前最新的版本是2.0,具有以下特性:
(1). 动态JIT优化器。当负载超过一个确保代码产生的阈值时,选择性地产生字
节代码,这大大减少了内存的使用量。新的静态类型检查和属性支持,允许集成
类型安全表达。
(2). 错误报告的改善。包括行和列的错误信息。
(3). 新的脚本语言特征。MVEL2.0 包含函数定义,如:闭包,lambda定义,
标准循环构造(for, while, do-while, do-until…),空值安全导航操作,内联with
-context运营 ,易变的(isdef)的测试运营等等。
(4). 改进的集成功能。迎合主流的需求,MVEL2.0支持基础类型的个性化属性处理器,集成到JIT中。
(5). 更快的模板引擎,支持线性模板定义,宏定义和个性化标记定义。
(6). 新的交互式shell(MVELSH)。
(7). 缺少可选类型安全
(8). 集成不良,通常通过映射填入内容。没有字节码不能运作用字节码生成编
译时间慢,还增加了可扩展性问题;不用字节码生成运行时执行非常慢
(9). 内存消耗过大
(10). Jar巨大/依赖规模
使用代码:
@Test
public void evalList(){
String expression = "['Jim','Bob','Tom']";
List<String> list = (List<String>) MVEL. eval(expression);
for(String str : list){
System. out.println(str);
}
}
@Test
public void evalArray(){
String expression = "{'Jim','Bob','Tom'}";
Object array = MVEL.eval(expression);
if(array.getClass().isArray()){
System.out.println(Array.get(array, 0));
}
String intExpress = "{1,2,3,4}";
Object eval = MVEL.eval(intExpress);
if(eval.getClass().isArray()){
Object o = Array.get(eval, 0);
System.out.println((int)o);
}
}
@Test
public void evelMap(){
// String expression = "a == empty && b == empty";
// Map<String, Object> paramMap = Maps.newHashMap();
// paramMap.put("a", "");
// paramMap.put("b", null);
// Object object = MVEL.eval(expression, paramMap);
// System.out.println(object); // true
// String expression = "a == b";
// Map<String, Object> paramMap = Maps.newHashMap();
// paramMap.put("a", "123");
// paramMap.put("b", 123);
// Object object = MVEL.eval(expression, paramMap);
// System.out.println(object); // true
String express = "[\"Bob\" : new com.rec.pojo.Person(\"Bob\"), \"Michael\" : new com.rec.pojo.Person(\"Michael\")]";
Map eval = (Map)MVEL.eval(express);
System.out.println(eval.entrySet());
}
参考文章: https://www.jianshu.com/p/41ea7a43093c