- maven依赖
xml
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.5.2.Final</version>
</dependency>
- 示例
基础应用
java
// 获取表达式的结果
Map<String,Object> vars = new HashMap<>();
vars.put("age", 20);
vars.put("name", "Tom");
// 获取布尔表达式的结果
boolean ok1 = MVEL.evalToBoolean( "age >= 18 && name != null", vars);
System.out.println(ok1);
//先编译表达式再执行表达式,性能更高
Serializable compiled = MVEL.compileExpression("age >= 18 && name != null");
System.out.println(MVEL.executeExpression(compiled, vars, Boolean.class));
// 获取对象表达式的结果
User user = new User(1, 3,new Result("success",null));
CompiledAccExpression age = (CompiledAccExpression)MVEL.compileGetExpression("age");
System.out.println(age.getValue(user,null));
CompiledAccExpression msg = (CompiledAccExpression)MVEL.compileGetExpression("result.msg");
System.out.println(msg.getValue(user,null));
//通过表达式设置对象的属性
Serializable serializable = MVEL.compileSetExpression("result.data");
MVEL.executeSetExpression(serializable,user,"数据");
System.out.println(user.getResult().getData());
//自定义方法的使用
vars.put("add", MVEL.getStaticMethod(CustomFunc.class, "add", new Class[]{int.class, int.class}));
System.out.println(MVEL.eval("add(1,2)",vars));
vars.put("a", 20);
vars.put("b", 15);
//表达式中自定义函数的使用
String expression1 = "def addNum(num1, num2) { num1 + num2; }"
+"def subtractNum(num1, num2) { num1 - num2; }"
+"addNum(a, b) * subtractNum(a, b)";
System.out.println( MVEL.eval(expression1, vars));
- mvel2语法
基础语法
- 常量与赋值
var 变量名 = 值; 注: var可省略,必须以分号结尾;
groovy
var a = 10;
b = 10;
- 返回值
代码最后一行自动为返回值
return 值; 手动返回值
- 常用运算
加法:+ 减法:- 乘法:* 除法:/ 取余:%
大于:> 小于:< 大于等于: >= 小于等于: <= 等于:== 不等于:!=
逻辑与:&& 逻辑或:|| 逻辑非: !
三目运算符: 条件表达式?表达式1:表达式2
groovy
a + b;//加法
a - b;//减法
a * b;//乘法
a / b;//除法
a % b;//取余
groovy
a > b;//大于
a < b;//小于
a >= b;//大于等于
a <= b;//小于等于
a == b;//等于
a != b;//不等于
groovy
a && b;//逻辑与
a || b;//逻辑或
!a;//逻辑非
groovy
age = 17;
age>18?'成年':'未成年';
- 集合
List集合: [元素1,元素2,元素3,...]
Map集合: {"键1":"值1","键2":"值2",...}
groovy
//List集合
list = [10,20,30];
item = list[0];//获取列表的第一个元素
len = list.size();//获取列表的长度
groovy
//Map集合
user = ["name":"张三"];
name = user.name;//获取用户姓名
- 函数
def 函数名(参数1,参数2,...){函数体}
groovy
//方法
def add(a,b){
return a + b
}
//调用方法
result = add(10,20);
流程控制
- 判断条件
if(条件表达式){}else{} 注: 不支持else if()
groovy
score=85;
if(score >= 60){
res = "及格";
}else{
res = "不及格";
}
- 循环语句
while(条件表达式){}
for(变量名 : 集合){}
do{循环体}while(条件表达式)
groovy
sum = 0;i = 1;
while(i <= 10){
sum = sum + i;
i = i + 1;
}
sum;
groovy
list = [1,2,3,4,5,6,7,8,9,10];
sum = 0;
for (item : list) {
sum += item;
}
sum
groovy
k=1;
do{
k=k+1;
}while(k<5)
k;
外部传参使用
Java 传入 Map 参数,脚本直接读取参数值
groovy
// 直接使用Java传入的key
name + " 年龄:" + age
直接调用Java方法
可直接调用静态方法.
字符串可直接调用字符串相关方法.
对象可通过new直接创建.
groovy
Math.random();
System.currentTimeMillis();
groovy
'hello mvel'.toUpperCase()
groovy
date = new java.util.Date(); date.getTime();
import java.util.Date;date = new Date(); date.getTime();
- 常用API
MVEL
| 方法 | 说明 |
|---|---|
| isAdvancedDebugging() | 判断是否开启高级调试模式 |
| getDebuggingOutputFileName() | 获取调试日志输出的文件名 |
| isFileDebugging() | 判断是否开启文件输出调试 |
| eval(String expression) eval(String expression, Object ctx) eval(String expression, VariableResolverFactory resolverFactory) eval(String expression, Object ctx, VariableResolverFactory resolverFactory) eval(String expression, Map<String, Object> vars) eval(String expression, Object ctx, Map<String, Object> vars) eval(String expression, Class toType) eval(String expression, Object ctx, Class toType) eval(String expression, VariableResolverFactory vars, Class toType) eval(String expression, Map<String, Object> vars, Class toType) eval(String expression, Object ctx, VariableResolverFactory vars, Class toType) eval(String expression, Object ctx, Map<String, Object> vars, Class toType) | 执行指定表达式 expression表达式,类型可为字符串或字符数组 ctx为根对象,可直接访问 vars为变量(Map或VariableResolverFactory) toType为返回值类型 |
| evalToString(String expression) evalToString(String expression, Object ctx) evalToString(String expression, VariableResolverFactory vars) evalToString(String expression, Map vars) evalToString(String expression, Object ctx, VariableResolverFactory vars) evalToString(String expression, Object ctx, Map vars) | 执行指定表达式返回字符串 |
| evalFile(File file) evalFile(File file, String encoding) evalFile(File file, Object ctx) evalFile(File file, String encoding, Object ctx) evalFile(File file, Map<String, Object> vars) evalFile(File file, Object ctx, Map<String, Object> vars) evalFile(File file, String encoding, Object ctx, Map<String, Object> vars) evalFile(File file, Object ctx, VariableResolverFactory vars) evalFile(File file, String encoding, Object ctx, VariableResolverFactory vars) | 执行指定mvel 脚本文件 |
| evalToBoolean(String expression, Object ctx, Map<String, Object> vars) evalToBoolean(String expression, Object ctx) evalToBoolean(String expression, Object ctx, VariableResolverFactory vars) evalToBoolean(String expression, VariableResolverFactory vars) evalToBoolean(String expression, Map<String, Object> vars) | 执行指定表达式返回布尔类型 |
| analysisCompile(char[] expression, ParserContext ctx) analysisCompile(String expression, ParserContext ctx) | 先做静态检查再生成编译后的表达式 |
| analyze(char[] expression, ParserContext ctx) analyze(String expression, ParserContext ctx) | 纯静态检查(不执行、不编译),校验表达式语法是否合法、收集表达式用到的所有变量、检查方法 / 类是否存在、提前拦截错误表达式 |
| compileExpression(String expression) compileExpression(String expression, Map<String, Object> imports) compileExpression(String expression, Map<String, Object> imports, Map<String, Interceptor> interceptors) compileExpression(String expression, ParserContext ctx) compileExpression(String expression, Map<String, Object> imports, Map<String, Interceptor> interceptors, String sourceName compileExpression(char[] expression, int start, int offset, ParserContext ctx) | 编译表达式, expression表达式,类型可为字符串或字符数组 |
| compileGetExpression(String expression) compileGetExpression(String expression, ParserContext ctx) | 处理 Java Bean 属性读写,编译 获取属性 表达式,expression表达式,类型可为字符串或字符数组 |
| compileSetExpression(String expression) compileSetExpression(String expression, ParserContext ctx) compileSetExpression(String expression, Class ingressType, ParserContext ctx) compileSetExpression(char[] expression, int start, int offset, ParserContext ctx) | 处理 Java Bean 属性读写,编译 设置属性 表达式, expression表达式,类型可为字符串或字符数组 |
| executeSetExpression(Serializable compiledSet, Object ctx, Object value) executeSetExpression(Serializable compiledSet, Object ctx, VariableResolverFactory vrf, Object value) | 执行 设置属性 表达式 |
| executeExpression(Object compiledExpression) executeExpression(Object compiledExpression, Object ctx, Map vars) executeExpression(Object compiledExpression, Object ctx, VariableResolverFactory resolverFactory) executeExpression(Object compiledExpression, VariableResolverFactory factory) executeExpression(Object compiledExpression, Object ctx) executeExpression(Object compiledExpression, Map vars) executeExpression(Object compiledExpression, Object ctx, Map vars, Class toType) executeExpression(Object compiledExpression, Object ctx, VariableResolverFactory vars, Class toType) executeExpression(Object compiledExpression, Map vars, Class toType) executeExpression(Object compiledExpression, Object ctx, Class toType) executeExpression(Iterable compiledExpression) executeExpression(Iterable compiledExpression, Object ctx) executeExpression(Iterable compiledExpression, Map vars) executeExpression(Iterable compiledExpression, Object ctx, Map vars) executeExpression(Iterable compiledExpression, Object ctx, VariableResolverFactory vars) | 执行表达式 |
| executeAllExpression(Serializable[] compiledExpressions, Object ctx, VariableResolverFactory vars) | 批量执行表达式 |
| executeDebugger(CompiledExpression expression, Object ctx, VariableResolverFactory vars) | 带调试能力执行表达式 |
| parseMacros(String input, Map<String, Macro> macros) | 宏定义解析,解析MVEL中的 #macro 宏定义 |
| preprocess(String input, PreProcessor[] preprocessors) | 表达式预处理,对原始表达式提前加工、替换、改写,expression表达式,类型可为字符串或字符数组 |
| getProperty(String property, Object ctx) | 读取对象属性 |
| setProperty(Object ctx, String property, Object value) | 写入对象属性 |
| getStaticMethod(Class cls, String methodName, Class[] signature) | 获取 Java 静态方法 |