小编给大家分享一下Java怎么使用JEXL实现动态表达式编译,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!做项目突然遇到这样的需求:
系统要获取多个数据源的数据,并进行处理,最后输出多个字段。字段的计算规则一般是简单的取值最多加一点条件判断。
而且需要动态变动!!例如一个字段a的取值,如果a > 10的时候输出10,a =10 则输出a,就需要对代码改动,再测试再发布才能到生产环境使用。
一两个这样的字段还没什么,如果整个系统所依赖的字段都有这样的属性,那么我们就需要找一种方法来实现动态的加载逻辑。
下面介绍的JEXL就可以解决这种问题JEXL(Java Expression Language)介绍JEXL – Apache Commons JEXL Overview下面用一些实例来介绍JEXL的使用方法实例maven依赖:
正则表达式匹配首先写一个公共方法:下面是使用JEXL调用的方法代码中的expression变量就是可以动态编译的表达式,这里要注意表达式中出现的所有变量,都需要事先set进JexlContext中,否则会报错。这里有多种形式的错误:①如果没有set”Uti免费云主机域名l”,程序运行中会抛出异常。org.apache.commons.jexl2.JexlException: TmpTest.RL@40![13,40]: ‘ans = QeUtil.regMatch(‘[一-龥]{10,}’, str);’ attempting to call method on null②如果没有set”str”,程序不会抛出异常,并输出null。如果你的regMatch方法中有判空处理,就会输出判空的结果。如果没有判空处理,在控制台的输出如下:警告: TmpTest.RL@39![36,39]: ‘ans = QeUtil.regMatch(‘[一-龥]{10,}’, str);’ undefined variable str
二月 21, 2017 4:00:41 下午 org.apache.commons.jexl2.JexlEngine invocationFailed
警告: TmpTest.RL@39![13,40]: ‘ans = QeUtil.regMatch(‘[一-龥]{10,}’, str);’ method invocation error
java.lang.NullPointerException③如果没有set”ans”,程序会正常运行,并输出正确值
为了保险起见,建议表达式中出现的所有变量,都需要事先set进JexlContext中循环JEXL支持两种循环方式:和下面是使用while的实例:getset方法调用JEXL支持传入对象,并调用对象的方法
下面的简单的getset方法的实例:上面的用例会在控制台先输出1,再输出2以上是“Java怎么使用JEXL实现动态表达式编译”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注百云主机行业资讯频道!
相关推荐: MySQL中InnoDB与MyISAM的对比分析
小编给大家分享一下MySQL中InnoDB与MyISAM的对比分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。