MVEL是一种基于java语法的表达式语言,为java提供更便捷灵活的动态性。
这里简单介绍一些MVEL的操作:
new 创建一个java对象,new String("foo"),当然这里是举个栗子,String的创建一般是不同这个构造函数的。
对于java.lang.*中的类,无需手动导入。如果是创建自定义的对象,就需要写明类全路径名,或者手动导入。
当需要针对同一个对象进行多次操作时,可以是with语句块来高效操作,
with(user = new User()) {
name = 'jacker',age = 18,sex = Sex.FEMALE
}
更便捷是可以使用点号操作
user = new User().{
name="jack";
parent = new User().{
name = "jack\'s parent";
}
}
动态脚本的一个头痛问题就是变量的作用域问题,经常在调试的时候发现一个局部变量覆盖了全局变量导致程序出错。
mvel提供 isdef 来判断某个变量在当前作用域内是否已经定义。defined = isdef var; 或者 if (isdef var) { doSomething();}
MVEL对正则表达式匹配做了简化,只需要通过 ~= 操作符判断即可,if(var ~= '[a-z].+') {doSomething();}
对集合的一些操作也进行了简化,var contains 'test' 判断var集合中是否包含'test'字符串,var可以是一个array,list或者map,
map的话就是判断keyset中是否包含指定的值。var也可以为string,在MVEL中string被认为是一个数组。
支持 in 操作符对list进行遍历,names = (name in users) 上面的操作可以很快的得到 users集合中每个元素的name属性。
同样支持调用集合中元素的方法(静态方法或者实例方法),(sayHello() in users) ,另外可以在子句后面加上if判断对list中
的元素过滤。 $ 用作占位符,($ in users if $.name contains 'jack')
==操作与java中的不用,MVEL中的使用equals()方法判断的。
list 创建
["Jim", "Bob", "Smith"]
map 创建
['Bob' : new Person('Bob'), 'Michael' : new Person('Michael')]
Array 创建
{"Jim", "Bob", "Smith"}
同时支持 lambda 表达式
threshold = def (x) { x >= 10 ? x : 0 }; result = cost + threshold(lowerBound);
更多的详细内容可以参考MVEL Language Guide
http://mvel.codehaus.org/Language+Guide+for+2.0
下面介绍一下例子:
表达式的执行有两种模式
一种是编译模式,就是先编译表达式并缓存,执行的时候传入对应的参数
一种是解析模式,跟其他脚本语言一样,边解析边执行
编译模式
ExpressionCompiler compiler = new ExpressionCompiler("x + y");
CompiledExpression exp = compiler.compile();
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", 10);
params.put("y", 20);
Object result = MVEL.executeExpression(exp, params);
System.out.println(result);
解析模式
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", 10);
params.put("y", 20);
Object result = MVEL.eval("x+y", params);
System.out.println(result);
调用脚本文件中的函数
File scriptFile = new File("src/main/java/com/test/mvel/test.el");
VariableResolverFactory resolverFactory = new MapVariableResolverFactory();
MVEL.evalFile(scriptFile, ParserContext.create(), resolverFactory);
resolverFactory.createVariable("x", 10);
resolverFactory.createVariable("y", 20);
Object result = MVEL.eval("add(x,y);", resolverFactory);
System.out.println(result);
test.el 文件内容
引用
def add(a,b){
a + b;
}
分享到:
相关推荐
MVEL 2.0表达式语言MVEL 2.0表达式语言MVEL 2.0表达式语言
mvel14-1.2.21.jar mvel14-1.2.21.jar
mvel2.0语法指南,MVEL通常用于执行用户(程序员)通过配置XML文件或注释等定义的基本逻辑。它也可以用来解析简单的JavaBean表达式。Runtime(运行时)允许MVEL表达式通过解释执行或者预编译生成字节码后执行。
mvel2.0语法指南中文版
很好的MVEL基础语法学习资料,希望能帮到你~
MVEL is very easy to use, and just as easy to integrate into your application. Let's take a quick look at a simple MVEL expression: foo.name == "Mr. Foo" This simple expression asks MVEL if the value...
介绍 这是一个用于测试表达式的简单 Repl(Read-Eval-Print-Loop)。 用法 由于这是一个简单的 Maven 项目,因此可以使用 > mvn install 项目配置了Maven exec插件,直接调用即可启动repl > mvn exec:java
功能强大的基于Java应用程序的表达式语言.
mvel2-2.1.6.Final-javadoc
NULL 博文链接:https://yanguz123.iteye.com/blog/2146176
java运行依赖jar包
mvel-maven-插件 使用 MVEL 渲染模板的 Maven 插件。 用法 < groupId>uk.co.codezen < artifactId>mvel-maven-plugin < version>1.0 < goal>render < template
mvel2-2.1.0.drools16.jar mvel2-2.1.0.drools16.jar
MVEL is an expression language – similar to OGNL – and a templating engine. I’d like to give you an example of MVEL Templates in this post so you can find out if MVEL might work for you. Templating...
简单规则 结合和Java 项目演示了如何在 Java 中实现轻量级规则引擎并使决策能够表示为字符串,从而在属性文件或数据库中外部化,或通过 JMX 使用和。