java如何利用JEXL实现动态表达式编译

  介绍

小编给大家分享一下java如何利用JEXL实现动态表达式编译,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

背景

做项目突然遇到这样的需求:
系统要获取多个数据源的数据,并进行处理,最后输出多个字段。字段的计算规则一般是简单的取值最多加一点条件判断。
而且需要动态变动! !例如一个字段一个的取的值,如果比;10的时候输出10日& lt;=10则输出。这里的10个可能在一天后改成8,也可能在后天就改成了12。当然,如果只是一个数字的变动还好说,我们可以使用数据库进行存储。但是,万一哪天需求突然变成了& lt;10的时候输出10,祝辞=10则输出,就需要对代码改动,再测试再发布才能到生产环境使用。
一两个这样的字段还没什么,如果整个系统所依赖的字段都有这样的属性,那么我们就需要找一种方法来实现动态的加载逻辑。
下面介绍的JEXL就可以解决这种问题

JEXL (Java表达式语言)介绍

JEXL - Apache Commons JEXL概述

下面用一些实例来介绍JEXL的使用方法

<强>实例

maven依赖:

& lt; dependency>   ,,,& lt; groupId> org.apache.commons   ,,,& lt; artifactId> commons-jexl   ,,,& lt; version> 2.0 & lt;/version>   & lt;/dependency>

<强>正则表达式匹配

首先写一个公共方法:

public  class  Util  {   ,,,public  static  boolean  regMatch (String 正则表达式,String  str), {   ,,,,,,,Pattern  Pattern =, Pattern.compile(正则表达式);   ,,,,,,,return  pattern.matcher (str) .matches ();   ,,,}   }

下面是使用JEXL调用的方法

public  void  RL (), {   ,,,JexlContext  jc =, new  MapContext ();   ,,,String  str =,“一二三四五六七八九十“;   ,,,jc.set (“Util",, new 实效());   ,,,jc.set (“str",, str);   ,,,jc.set (“ans",,““);   ,,,String  expression =,“ans =, Util.regMatch (\“[\ u4e00 - \ u9fa5] {10} \“, str)“;   ,,,Expression  e =, new  JexlEngine () .createExpression(表达式);   ,,,e.evaluate (jc);   ,,,System.out.println (jc.get (“ans"));   }

代码中变的表达量就是可以动态编译的表达式,这里要注意表达式中出现的所有变量,都需要事先设置进JexlContext中,否则会报的错。这里有多种形式的错误:

①如果没有设置“跑龙套”,程序运行中会抛出异常。

org.apache.commons.jexl2.JexlException: TmpTest.RL@40 ![13日40]:& # 39;ans=QeUtil.regMatch(& # 39;[一-龥]{10}& # 39;,str); & # 39;试图调用方法> (item :列表),{   ,,,x =, x  +,项目;   }

while  (x  lt  10), {   ,,,x =, x  +, 2;   }

下面是使用的时实例:

public  void 循环(),{   ,,,JexlContext  jc =, new  MapContext ();   ,,,jc.set (“a",, 1);   ,,,jc.set (“b",,“0”);   ,,,jc.set (“ans",, new  StringBuffer ());   ,,,Expression  e =, new  JexlEngine () .createExpression (“while  (& lt; a  10), {a =, a  +, 1; ans.append (b);}“);   ,,,e.evaluate (jc);   ,,,System.out.println (jc.get (“ans"));   }

<强>获取\设置方法调用

JEXL支持传入对象,并调用对象的方法
下面的简单的获取\设置方法的实例:

public  void  getSet (), {   ,,,TmpTest  TmpTest =, new 人体();   ,,,tmpTest.setA (1);   ,,,JexlContext  jc =, new  MapContext ();   ,,,jc.set (“tmpTest",,人体);   ,,,jc.set (“ans",,““);   ,,,Expression  e =, new  JexlEngine () .createExpression (“ans =, tmpTest.getA ()“);   ,,,e.evaluate (jc);   ,,,System.out.println (jc.get (“ans"));   ,,,e =, new  JexlEngine () .createExpression (“ans =, tmpTest.setA (2)“);   ,,,e.evaluate (jc);   ,,,TmpTest  tmpTest1 =,(人体),jc.get (“tmpTest");   ,,,System.out.println (tmpTest1.getA ());   }

上面的用例会在控制台先输出1,再输出2

以上是“java如何利用JEXL实现动态表达式编译”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

java如何利用JEXL实现动态表达式编译