表达式引擎Mvel

​欢迎光临我的博客查看最新文章: https://river106.cn

1、Mvel简介

MVEL(MVFLEX Expression Language)是一种简单、轻量级的表达式语言,主要用于Java环境。它类似于JSP的EL(Expression
Language)和OGNL(Object-Graph Navigation Language),但具有更小的体积和更简单的语法。

MVEL的主要特点包括:
1.轻量级:MVEL的体积小,可以快速集成到项目中。
2.易于使用:其语法直观,易于学习和使用。
3.强大的功能:支持多种类型的表达式,包括算术、逻辑、字符串操作等。
4.集成性:可以与Java环境无缝集成,轻松访问Java对象和方法。
5.性能:MVEL在表达式评估方面通常具有较高的性能。

MVEL常用于以下场景:

  • 在应用程序中动态地计算表达式值。
  • 在规则引擎中定义和执行业务规则。
  • 在模板引擎中动态渲染内容。

使用MVEL时,你可以编写表达式,并使用MVEL引擎来解析和执行这些表达式。例如,你可以编写一个字符串表达式,并将其传递给MVEL引擎进行评估,然后获取结果。

文档:http://mvel.documentnode.com/

2、Mvel使用

2.1、引入maven依赖

<dependency><groupId>org.mvel</groupId><artifactId>mvel2</artifactId><version>2.4.14.Final</version>
</dependency>

2.2、执行表达式

public class MvelTest {public static void main(String[] args) {String expression = "2 + 3 * 4";Object result = MVEL.eval(expression);System.out.println("Result: " + result);}
}

2.3、使用变量

public class MvelTest {public static void main(String[] args) {String expression = "x + y";Map<String, Integer> variables = new HashMap<>(4);variables.put("x", 2);variables.put("y", 3);Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}

2.4、使用if-else语句

public class MvelTest {public static void main(String[] args) {String expression = "if (x > y) { x } else { y }";Map<String, Object> variables = new HashMap<>(4);variables.put("x", 2);variables.put("y", 3);Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}

2.5、使用foreach语句

public class MvelTest {public static void main(String[] args) {String expression = "foreach (item : list) { System.out.print(item) }";Map<String, Object> variables = new HashMap<>(2);variables.put("list", Arrays.asList(1, 2, 3, 4, 5));Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}

2.6、使用对象

public class MvelTest {public static void main(String[] args) {String expression = "person.name + ' ' + person.age";Map<String, Object> variables = new HashMap<>(2);variables.put("person", new Person("John", 30));Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}private static class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}}
}

2.7、使用集合

public class MvelTest {public static void main(String[] args) {String expression = "list.size()";Map<String, Object> variables = new HashMap<>(2);List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);variables.put("list", list);Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}

2.8、使用函数

public class MvelTest {public static void main(String[] args) {String expression = "Math.pow(x, y)";Map<String, Object> variables = new HashMap<>();variables.put("x", 2);variables.put("y", 3);Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}

2.9、使用自定义函数


public class MvelTest {public static void main(String[] args) {String expression = "myFunction(x, y)";Map<String, Object> variables = new HashMap<>();variables.put("x", 2);variables.put("y", 3);variables.put("myFunction", new MyFunction());Object result = MVEL.eval(expression, variables);}private static class MyFunction {public double myFunction(double x, double y) {return Math.pow(x, y);}}
}

2.10、使用自定义类

public class MvelTest {public static void main(String[] args) {String expression = "cn.river.base.mvel.StringUtils.reverse(s)";Map<String, Object> variables = new HashMap<>();variables.put("s", "Hello, World!");Object result = MVEL.eval(expression, variables);System.out.println("Result: " + result);}
}public class StringUtils {public static String reverse(String s) {return new StringBuilder(s).reverse().toString();}
}

2.11、编译表达式

public class MvelTest {public static void main(String[] args) {String expression = "x + y";Map<String, Object> variables = new HashMap<>(4);variables.put("x", 2);variables.put("y", 3);Serializable serializable = MVEL.compileExpression(expression);Object result = MVEL.executeExpression(serializable, variables);System.out.println("Result: " + result);}
}

MVEL.compileExpression(string)是将表达式编译成mvel可执行的内容,然后通过MVEL.executeExpression(expression)执行。
编译后的表达式可以缓存起来,下次直接执行,减少编译时间,提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …

【学习路线】Python 算法(人工智能)详细知识点学习路径(附学习资源)

学习本路线内容之前&#xff0c;请先学习Python的基础知识 其他路线&#xff1a; Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析&#xff08;数据科学&#xff09; >> Python 算法&#xff08;人工智能&#xff09; >> Pyth…

游戏引擎学习第77天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾昨天的 bug 今天我们继续开发进度&#xff0c;进行调试昨天代码的问题&#xff0c;主要是关于如何跟踪玩家和敌人在世界中的高度位置。虽然我们做的是一款 2D 游戏&#xff0c;但我们希望能够处理多层的房间&#xff0c;玩家…

第30天:Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

#知识点 1、安全开发-原生PHP-开发组件集合 2、安全开发-原生PHP-模版引擎渲染 3、安全开发-原生PHP-第三方编辑器 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适合复杂…

with as提高sql的执行效率

实战sql with cte(UNIT_ID, UNIT_NAME, PARENT_UNIT_ID, UNIT_CODE ) as (select UNIT_ID, UNIT_NAME, PARENT_UNIT_ID , UNIT_CODEfrom HPFM_UNITunion allselect t.UNIT_ID, t.UNIT_NAME, t.PARENT_UNIT_ID, t.UNIT_CODEfrom HPFM_UNIT tjoin cte on t.PARENT_UNIT_ID cte.U…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

Docker--Docker Volume(存储卷)

什么是存储卷&#xff1f; Docker的存储卷是一种将宿主机的本地文件系统中的某个目录与容器内部的文件系统中的某个目录建立绑定关系的机制。这种绑定关系意味着&#xff0c;当在容器的这个目录下写入数据时&#xff0c;会同步到宿主机的这个目录中&#xff1b;同样&#xff0…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题&#xff1a;用豆包MarsCode IDE&#xff0c;从0到1画出精美数据大屏&#xff01; 豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

PCB原理图的编译设置

设置步骤&#xff1a; 进入-->Project Options...&#xff0c;对照设置“致命错误”部分来设置即可

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)

研发算力显卡RTX50系列&#xff0c;PC端显卡GB10&#xff0c;开源大模型Cosmos&#xff08;用于机器人和自动驾驶&#xff09;&#xff0c; Isaac GR00T&#xff08;人形机器人的数据采集平台&#xff09;。 新一代 RTX 50 系列显卡 RTX 50 系列 GPU&#xff0c;相对之前系列&a…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

基于开发/发布/缺陷分离模型的 Git 分支管理实践20250103

基于开发/发布/缺陷分离模型的 Git 分支管理实践 引言 在现代软件开发中&#xff0c;合理的分支管理策略是保证项目成功的关键因素之一。本文将详细介绍一种基于开发/发布/缺陷分离的 Git 分支管理模型&#xff0c;这种模型不仅能提升团队协作效率&#xff0c;还能确保代码质…

数据库回滚:大祸临头时

原文地址 什么是数据库回滚&#xff1f; 数据库技术中&#xff0c;回滚是通过撤销对数据库所做的一项或多项更改&#xff0c;将数据库返回到先前状态的操作。它是维护数据完整性和从错误中恢复的重要机制。 什么时候需要数据库回滚&#xff1f; 数据库回滚在以下几个场景中很…

1月7日星期二今日早报简报微语报早读

1月7日星期二&#xff0c;农历腊月初八&#xff0c;早报#微语早读。 1、公安部&#xff1a;已为一线民警配备执法记录仪130万余部&#xff0c;规范现场执法&#xff1b; 2、浙江提出2035年全省域基本实现共同富裕&#xff1b; 3、“汕头牛肉丸”有新标准&#xff01;1月6日起…

数据结构:时间复杂度和空间复杂度

我们知道代码和代码之间算法的不同&#xff0c;一定影响了代码的执行效率&#xff0c;那么我们该如何评判算法的好坏呢&#xff1f;这就涉及到了我们算法效率的分析了。 &#x1f4d6;一、算法效率 所谓算法效率的分析分为两种&#xff1a;第一种时间效率&#xff0c;又称时间…

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件&#xff0c;可能有些方面不够完善&#xff0c;欢迎大佬指点。 这里就不演示创建创建Server和Project&#xff0c;可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评

最新安徽省乡镇界面图层arcgis数据shp格式-乡镇名称和编码2020年wgs84坐标无偏移

LabVIEW软件Bug的定义与修改

在LabVIEW软件开发过程中&#xff0c;bug&#xff08;程序错误或缺陷&#xff09;指的是程序中导致不符合预期行为的任何问题。Bug可能是由于编码错误、逻辑漏洞、硬件兼容性问题、系统资源限制等因素引起的。它可能会导致程序崩溃、功能无法正常执行或输出结果不符合预期。理解…