表达式计算器(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 静态方法
相关推荐
其实防守也摸鱼1 小时前
软件安全与漏洞--软件安全编码
java·前端·网络·安全·网络安全·web·工具
888CC++1 小时前
栈上分配 VS 堆分配 核心区别
java·开发语言·jvm
艾利克斯冰1 小时前
Java面试题汇总
java
我是一颗柠檬2 小时前
【JavaSE全面教学】Java集合框架下Day13(2026年)
java·开发语言·intellij-idea
vx-程序开发2 小时前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php
LCG元2 小时前
RAG工程指南:从基础检索到生产部署全解析
java·运维·数据库
石榴树下的七彩鱼3 小时前
医疗票据 OCR 识别 API 多场景落地指南:医保结算 + 商保理赔 + 医疗信息化(附 Python/Java 完整示例)
java·python·ocr·石榴智能·医疗票据ocr·医保结算·ocrapi
C137的本贾尼3 小时前
Spring AI Alibaba 开箱:国产百炼大模型初体验
java·人工智能·spring
金銀銅鐵3 小时前
[Java] 如何理解 class 文件中字段的 access flags?
java·后端