JEXL表达式引擎的使用

简单介绍

JEXL的全称是Java表达式语言(Java Expression Language),简单的说,它可以配合我们的Java程序运算一些简单的表达式,由于近期的项目的中用到了,所以记录一下它的使用方法,很简单。具体可以识别哪些表达式?其中包含最基本的加减乘除、大于小于等于、与或非、按位与、按位或、按位异或、按位补码,除此之外还可以调用Java程序中方法,比如要判断一个字符串是否包含某一个字符,就可以调用String的contains()方法来判断,在下文中会出现这样的事例。当然远不止这些基本的运算符,想要了解更多的话可以去看官方文档:commons.apache.org/proper/comm…

如何使用

首先引入依赖的包

<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-jexl</artifactId>
		<version>2.1.1</version>
</dependency>

基本的步骤是:

  1. 创建表达式引擎对象
  2. 创建表达式语句
  3. 创建Context对象,为表达式中的未知数赋值
  4. 使用表达式引擎创建表达式对象
  5. 使用表达式对象计算
// 创建表达式引擎对象
JexlEngine engine = new JexlEngine();
// 创建表达式语句
String expressionStr = "money > 5000";
// 创建Context对象,为表达式中的未知数赋值
JexlContext context = new MapContext();
context.set("money","10000");
// 使用表达式引擎创建表达式对象
Expression expression = engine.createExpression(expressionStr);
// 使用表达式对象计算
Object evaluate = expression.evaluate(context);
// 输出结果:true
System.out.println(evaluate);

基本的使用套路就是这样,使用起来很简单,下面列举一下常用的几种场景,大家可以结合官方文档举一反三

// 判断提交时间是否大于某一个时间点
String expressionStr = "submitTime.getTime() >= 1583856000000";
context.set("submitTime",new Date());
// 判断字符串是否包含“成功”
String expressionStr = "text.contains('成功')";
context.set("text","请求成功");
// 判断字符串是否为空
String expressionStr = "text eq null || text.size() == 0"
// 判断是否属于数组中的任意一个
String expressionStr = "text =~ ['请求成功','啦啦','吧啦吧啦']"
// 判断是否不属于数组中的任意一个
String expressionStr = "text !~ ['请求成功','啦啦','吧啦吧啦']"
// 表达式为逻辑语句,运算结果为:2
String expressionStr = "if(a>b){c=a;}else{c=b};";
context.set("a", 1);
context.set("b", 2);
// 表达式为对象调用方法
String expressionStr = "person.getName()";
Person person = new Person();
person.setName("Sixj");
context.set("person", person);