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);}
}

以上。

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

  1. Ae:表达式语法基础

    Ae 中所有的属性都有一个或多个值 Value. 通过表达式更改属性的初值,在过程中可以使用不同类型的数据或方法,但最终的值必须跟初值同类型. 了解四种值类型是学好表达式的基础及关键. 单值 Numb ...

  2. Ae:表达式应用基础

    通过几个最常用的变量及函数(方法)来了解 Ae 表达式. 有关表达式语言语法基础,请参阅: <Ae:表达式语法基础> ◆  ◆  ◆ 时间相关 time 返回合成的当前时间值,以秒为单位. ...

  3. Ae:表达式语言基础

    ◆  ◆  ◆ 四种值类型 Ae 中所有的属性都有一个或多个值 Value. 通过表达式更改属性的初值,在过程中可以使用不同类型的数据或方法,但最终的值必须跟初值同类型. 了解四种值类型是学好表达式的 ...

  4. el表达式 java_java基础学习:JavaWeb之EL表达式

    其他更多java基础文章: java基础学习(目录) 一.EL表达式 EL 全名为Expression Language.JSP中可以使用EL表达式,EL表达式是用"${}"括起来 ...

  5. Python return逻辑判断表达式 - 零基础入门教程

    目录 一.return 逻辑判断表达式 and 二.return 逻辑判断表达式 or 三.return 逻辑判断表达式 and 和 or 配合使用 四.return 逻辑判断表达式重点总结 五.猜你 ...

  6. web爬虫讲解—urllib库中使用xpath表达式—BeautifulSoup基础

    在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块,然后将网页数据通过lxml下的etree转化为treedata的形式 urllib库中使用xpath表 ...

  7. java8 朗姆表达式,Python基础

    本文摘自<>,为我的总结文档python 第一部分 基础知识 第一章 起步 无git 第二章 变量和简单数据类型 2.1 变量 -变量命名规则:编程 以字母.数字和下划线命名,不能以数字开 ...

  8. python基础内容表达式_01-python基础之python介绍、三元表达式

    本节参考博客 备注:本系列博客除特别标注,默认的环境为python3 学习方法 1. 上课 上课听课的时候只认真听讲,跟着老师走,不要做笔记,如果有重要的知识点,在练习时间再做对应的练习,把重要的知识 ...

  9. Lambda表达式的基础知识(一)

    Lambda表达式简介: 一.什么是Lambda表达式? Lambda表达式也被称为箭头函数.匿名函数.闭包 Lambda表达式提现的是轻量级函数式编程思想 '->' 符号是Lambda表达式核 ...

最新文章

  1. JS设计模式学习实例之单例模式
  2. 基于运维网V8环境安装ntop
  3. java web 配置教程,javaWeb实战教程0-环境配置,javaweb实战教程0-
  4. Eigen库数据结构内存对齐问题
  5. c++ vector排序_儿童时间管理课6:便利贴时间排序法
  6. 计算机毕业设计——选题参考
  7. java jsp分页_jsp实现分页的步骤及代码
  8. 谷歌胜诉!10年Java版权案终结;京东、美团等10家平台承诺不用大数据杀熟;百度网盘海外版上传下载不限速 | EA周报
  9. Unity5.3官方VR教程重磅登场-系列4 VR中的用户界面
  10. html的网页主题标记是什么,html标记是什么
  11. 解锁视频编码的前世今生:流媒体产业的隐藏剧情
  12. 原奶周期与伊利、蒙牛的兼并战争
  13. UE5再次更新!扫描或手动建模面部模型可直接转为绑定好的Metahuman
  14. Ajax获取服务器端的响应
  15. Arista发布容器化、开放EOS版本
  16. python操作mysql数据库练习
  17. 【移动通信】 01-移动通信概论
  18. 一篇文章了解LSTM
  19. C/C++ 字符指针数组循环赋值问题
  20. 无法启动计算机丢失rtutils,丢失dll文件一键修复几个步骤就能搞定

热门文章

  1. 7-2 验证手机号码(C++ Java)
  2. 烽火HG2543C1获得telecomadmin密码以及禁用tr069
  3. 刷脸支付时代让智能终端回归人本身
  4. 【流媒体开发】11、ffmpeg命令过滤器(裁剪、水印、画中画、多宫格)
  5. unity hlsl 库函数
  6. Linux进程间通信手段
  7. docker启动状态为Exited (0)容器
  8. 333最大BST子树
  9. 拍照图片加入水印效果图片旋转了90度
  10. 运行Java字节码和应用使用的命令名字为_在运行字节码文件中,使用java命令,一定要给出字节码文件的扩展名.class...