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