脚本引擎对比

str转换javacode

https://zhuanlan.zhihu.com/p/33927344

场景

比如一个工单结算系统 工单有很多 并且有一定属性的单子需要按照一定的规则进行进行 那么这些规则会有很多并且无规则 那么使用写死的规则就会产生很多冗余code如果使用jexl技术就可以动态配置计算规则来解决这个问题

JavaScript

eval('console.log(2+3)')

Java

1.Groovy(http://groovy-lang.org/documentation.html https://github.com/apache/groovy)

	GroovyClassLoader groovyLoader = new GroovyClassLoader();
	Class<Script> groovyClass = (Class<Script>) groovyLoader.parseClass("a+b*c");
	Script script = groovyClass.newInstance();
	Binding bind = new Binding();
	bind.setVariable("a", 1);
	bind.setVariable("b", 2);
	bind.setVariable("c", 3);
	script.setBinding(bind);
	Object result =  script.run();
	//return 7
	特点
	由于大规模的使用和发展历史悠久,groovy功能强大到无与伦比,本身和java源码文件无缝兼容,又提供一大堆的语法糖和功能库

2.QLExpress(阿里的电商业务规则迭代频繁 中文文档 https://github.com/alibaba/QLExpress)

	1.特点
		1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型
		2、高效执行,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当
		3、弱类型脚本语言,和groovy,javascript语法类似和java语法些许不同
		4、安全控制,可以通过设置相关运行参数
	2.基本使用
		ExpressRunner runner = new ExpressRunner();
		DefaultContext<String, Object> context = new DefaultContext<String, Object>();
		context.put("a",1);
		context.put("b",2);
		context.put("c",3);
		String express = "a+b*c";
		Object r = runner.execute(express, context, null, true, false);
		System.out.println(r);
	3.语法
		1.支持 +,-,*,/,<,>,<=,>=,==,!=,<>【等同于!=】,%,mod【取模等同于%】,++,--,
		in【类似sql】,like【sql语法】,&&,||,!,等操作符 
		for,break、continue、if then else 等标准的程序控制逻辑
		2.不支持内部使用的min,max,round,print,println,like,in 都是系统默认函数的关键字,请不要作为变量名等(详看官方文档)
		3.可定义function 
		4.扩展操作符Operator(详看官方文档相当于自定义关键字(操作符)) 替换if then else 等关键字(用如果 则 否则 自定义汉字代替)
		5.绑定java类或者对象的method
		6.macro 宏定义

3.commons-jexl(类似于JSTL 官网 http://commons.apache.org/proper/commons-jexl/)

	1.基本使用
		public static Object strToJavaCode(String jexlExp, Map<String,Object> paramsMap){
			JexlEngine jexl=new JexlEngine();
			//jexl.setStrict(true);//method内部异常抛出
			Expression e = jexl.createExpression(jexlExp);
			JexlContext jc = new MapContext();
			if(paramsMap!=null && !paramsMap.isEmpty()){
				for(String key:paramsMap.keySet()){
					jc.set(key, paramsMap.get(key));
				}
			}
			return e.evaluate(jc);
		}
	2.语法
		1.可以通过返回的Object进行判断类型做业务逻辑判断(例如:数值和布尔)
		2.字符串需要加反斜杠转义
		3.for return if 等不识别(可以写三元表达式)
		4.实体类.属性或者map.属性可以 不需要使用get方法
		5.逻辑运算符号和运算符号都是可以的
		6.非基本类型如果为null会报错
		7.复杂的表达式可以考虑整合为java函数来解决

参考link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值