介绍
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);
}