表达式计算器(mvel2)

  1. maven依赖
xml 复制代码
<dependency>
    <groupId>org.mvel</groupId>
    <artifactId>mvel2</artifactId>
    <version>2.5.2.Final</version>
</dependency>
  1. 示例
基础应用
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));
  1. 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();
  1. 常用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 静态方法
相关推荐
benbenAItalk5 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl5 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885725 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户5 小时前
Java锁
java·开发语言
shehuiyuelaiyuehao7 小时前
1计算机是如何工作的
java·计算机网络
letisgo58 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周8 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8448 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘9 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言