赞
踩
QLExpress脚本引擎
1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。
3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。
4、安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
5、代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.3.1</version>
</dependency>
public static void testSimple() throws Exception { ExpressRunner runner = new ExpressRunner(); IExpressContext<String, Object> context = new DefaultContext<String, Object>(); // 设置变量 context.put("a", 0); context.put("b", 20); // 定义QLExpress表达式 String expression = "a == 0"; // 执行表达式 Object result = runner.execute(expression, context, null, true, false); // 输出结果 System.out.println("Result: " + result); }
public static void testDyExpress() throws Exception { ExpressRunner runner = new ExpressRunner(); IExpressContext<String, Object> context = new DefaultContext<String, Object>(); // 设置变量 context.put("a", 10); context.put("b", 20); // 定义表达式 String expression = "a + b * x"; // 设置动态变量 context.put("x", 2); long s = System.currentTimeMillis(); // 执行表达式 Object result = runner.execute(expression, context, null, false, false); // 输出结果 System.out.println("Result: " + result + "time " + (System.currentTimeMillis() - s)); }
自己集成Operator 实现AverageOperator
public class AverageOperator extends Operator { public AverageOperator(String name) { this.name = name; } @Override public Object executeInner(Object[] list) throws Exception { // 获取传递给自定义方法的参数列表 double num1 = Double.parseDouble(list[0].toString()); double num2 = Double.parseDouble(list[1].toString()); // 计算平均值 double average = (num1 + num2) / 2; // 返回结果 return average; } }
public static void testCustomMethod() throws Exception { ExpressRunner runner = new ExpressRunner(); IExpressContext<String, Object> context = new DefaultContext<String, Object>(); // 设置变量 context.put("a", 10); context.put("b", 20); // 定义表达式 String expression = "average(a, b)"; // 注册自定义方法 runner.addFunction("average", new AverageOperator("average")); // 执行表达式 Object result = runner.execute(expression, context, null, false, false); // 输出结果 System.out.println("Result: " + result); }
同自定义方法实现
class IsAdultOperator extends Operator {
public IsAdultOperator(String name) {
this.name = name;
}
@Override
public Object executeInner(Object[] list) throws Exception {
int age = Integer.parseInt(list[0].toString());
return age >= 18;
public static void testCustomRule() throws Exception { // 创建ExpressRunner实例 ExpressRunner runner = new ExpressRunner(); // 注册自定义方法 runner.addFunction("isAdult", new IsAdultOperator("isAdult")); // 创建规则 String rule = "if isAdult(age) then result = '成年人'; else result = '未成年人'; end"; // 创建上下文 IExpressContext<String, Object> context = new DefaultContext<>(); context.put("age", 18); // 执行规则 runner.execute(rule, context, null, true, false); // 获取结果 Object result = context.get("result"); // 输出结果 System.out.println("Result: " + result); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。