表达式计算器(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 静态方法
相关推荐
不爱编程的小九九12 分钟前
小九源码-springboot004-springboot智能阅读推荐系统
java·spring boot·后端
AC赳赳老秦1 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw
Java成神之路-1 小时前
深入理解三大高频队列:ArrayDeque、LinkedList、PriorityQueue 方法、特性与场景选择
java
roman_日积跬步-终至千里1 小时前
【资源控制】自助查询的智能路由
java·大数据·数据库
步行cgn2 小时前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
lhldsg2 小时前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
LayZhangStrive2 小时前
后端通识 - 后端工程开发常用的流程图类别
java·流程图·后端开发
WIN赢2 小时前
【抽象思想-从复杂中抽离简单、收敛的口子】
java·前端·javascript
captain3763 小时前
多线程单例模式
java·单例模式·java-ee
xiaotianyuanma3 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计