Mvel表达式的基础使用和自定义方法运用

Mvel表达式的基础使用和自定义方法运用Mvel 是一种易于使用 灵活且强大的表达式解析器 有点像是将我们的自然语言解析为计算机语言 留坑参考文章中的例子讲的不错 可以参考参考 https www liangzl com get article detail 164957 html

Mvel是一种易于使用、灵活且强大的表达式解析器,语法与java有些相似,功能有点像是将我们的自然语言解析为计算机语言(个人通俗理解,不准确)。

基础使用

文档:http://mvel.documentnode.com/#language-guide-for-2.0

举个最简单的例子:

要判断 5 是否大于 2,  或者计算 5减2这种算术运算, 直接用下面代码中写法即可

import org.mvel2.MVEL; import org.mvel2.ParserContext; import java.io.Serializable; / * Mvel测试 * * @author: Danger */ public class MvelTest { public static void main(String[] args) { System.out.println(MVEL.eval("5 > 2")); System.out.println(MVEL.eval("5 - 2")); Serializable expression = MVEL.compileExpression("5 + 2"); Object result = MVEL.executeExpression(expression); System.out.println(result); Object result2 = MVEL.executeExpression(MVEL.compileExpression("[1, 2, 3] contains 2")); System.out.println(result2); } }

其中, MVEL.compileExpression(string)是将表达式编译成mvel可执行的内容,然后通过MVEL.executeExpression(expression)执行。

Mvel表达式是默认支持一些方法的,像是上面例子中用到算术运算、list的contains方法等,同时也支持自定义方法。

自定义方法

某些场景我们需要更复杂的运算或者处理逻辑,这时候可以使用自定义方法。

大致流程:

1. 自定义方法

2. 将自定义方法添加到Mvel的ParserContext中

3. 基于ParserContext环境 编译和执行Mvel表达式

代码如下:

import org.apache.commons.lang3.StringUtils; / * 用户自定义方法 * * @author: Danger */ public class UserFunction { / * 字符串source 是否包含 target, 忽略大小写 * * @param source * @param target * @return boolean */ public static boolean containsIgnCase(String source, String target) { if (StringUtils.isEmpty(source) || StringUtils.isEmpty(target)) { return false; } if (source.toUpperCase().contains(target.toUpperCase())) { return true; } return false; } }
import org.apache.commons.lang3.StringUtils; import org.mvel2.MVEL; import org.mvel2.ParserContext; import java.io.Serializable; import java.lang.reflect.Method; / * Mvel编译 * * @author: Danger */ public class MvelCompiler { private static final MvelCompiler instance = new MvelCompiler(); private static ParserContext context; private MvelCompiler() { context = new ParserContext(); // 将UserFunction类中的所有方法加载到context中 Method[] declaredMethods = UserFunction.class.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { context.addImport(declaredMethod.getName(), declaredMethod); } // 或者用下面这种一个个指定的方式加载到context中 // context.addImport("containsIgnCase", MVEL.getStaticMethod(UserFunction.class, "containsIgnCase", new Class[]{String.class, String.class})); } public static MvelCompiler getInstance() { return instance; } public Serializable compile(String expression) { if (StringUtils.isNotEmpty(expression)) { return MVEL.compileExpression(expression, context); } return null; } }

测试验证:

/ * Mvel测试 * * @author: Danger */ public class MvelTest { public static void main(String[] args) { ParserContext parserContext = new ParserContext(); parserContext.addImport("containsIgnCase", MVEL.getStaticMethod(UserFunction.class, "containsIgnCase", new Class[]{String.class, String.class})); Serializable expression1 = MVEL.compileExpression("containsIgnCase('abc', 'BC')", parserContext); Object result3 = MVEL.executeExpression(expression1); System.out.println(result3); Object result4 = MVEL.executeExpression(MvelCompiler.getInstance().compile("containsIgnCase('abc', 'D')")); System.out.println(result4); } }

 

以上。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229500.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午4:34
下一篇 2026年3月16日 下午4:34


相关推荐

  • Window server 2012 R2 AD域的组策略设置

    Window server 2012 R2 AD域的组策略设置1.AD域的组策略添加有助于管理AD域中的用户使用的client端的环境。2.组策略依附于AD域的OU构成3.使用“gpmc.msc”在运行里面打开,或者是在“开始—管理工具”里面打开4.在打开的组策略管理界面里面,林kaka下的DefaultDomainPolicy为全局策略,而只对计算机做了配置。 一、简单组策略的建立实现:来做一个实例说明组策略的简单实现:要求:

    2022年5月13日
    47
  • vue+mongodb_mongodb开启auth认证

    vue+mongodb_mongodb开启auth认证刚刚安装完mongodb并且让这个mongodb安装成系统服务,然后给启动啦,以为自己这就可以像MySQL那样;安装好之后,配合可视化工具NavicatforMySQL简单的就跑起来了,但是呢,并不是这个样子。出bug啦,我暂且记录一下,正在找解决之法。UnabletofetchCollectionstatsInvalidcredentialsfordataba

    2022年8月21日
    6
  • metasploit指令_msfconsole下载

    metasploit指令_msfconsole下载在MSF里面msfconsole可以说是最流行的一个接口程序。很多人一开始碰到msfconsole的时候就害怕了。那么多复杂的命令语句需要学习,但是msfconsole真的是一个强大的接口程序。Msfconsole提供了一个一体化的集中控制台。通过msfconsole,你可以访问和使用所有的metasploit的插件,payload,利用模块,post模块等等。Msfconsole还有第三方程序的…

    2025年9月30日
    7
  • 正则表达式Python_python正则表达式匹配字符串

    正则表达式Python_python正则表达式匹配字符串转载:https://www.jianshu.com/p/5295c5988b7f一、正则表达式语法(一)字符与字符类1、特殊字符:\.^$?+*{}[]()|以上特殊字符要想使用字面值,必须使用\进行转义。2、字符类包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指定量词则只会匹配其中的一个。字符类内可以指定范围,比如[a-zA-Z0-9]表示a到z,A…

    2022年10月3日
    5
  • matlab支持向量回归,支持向量回归 MATLAB代码

    matlab支持向量回归,支持向量回归 MATLAB代码支持向量回归MATLAB代码(2013-05-3116:30:35)标签:教育支持向量机和神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强。大量仿真证实,支持向量机的泛化能力强于神经网络,而且能避免神经网络的固有缺陷——训练结果不稳定。本源码可以用于线性回归、非线性回归、非线性函数拟合、数据建模、预测、分类等多种应…

    2022年6月6日
    100
  • Laravel 虚拟开发环境 Homestead

    Laravel 虚拟开发环境 Homestead

    2021年10月28日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号