QLExpress动态脚本引擎解析工具

news2024/11/22 23:10:02

介绍

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

执行结果

在这里插入图片描述

参考

QLExpress

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二十二、责任链模式

目录 1、使用demo演示责任链模式2、传统方案解决oa系统审批3、传统方案解决oa系统审批存在的问题4、职责链模式基本介绍5、职责链模式原理类图6、职责链模式解决oa系统采购审批7、职责链模式的注意事项和细节8、职责链模式的实际使用场景举例 1、使用demo演示责任链模式 学校o…

讯飞星火认知大模型升级体验

今天讯飞星火新版本已更新至现网&#xff0c;增加了多模态、插件等很多功能~,阅读原文可以申请体验 官网地址&#xff1a;https://xinghuo.xfyun.cn/ 多模态能力 多模理解&#xff08;图片&#xff09;&#xff1a;支持用户图片输入&#xff0c;针对图片内容进行视觉问答。 …

Thread.sleep()不释放锁 Object.wait()释放锁

sleep()方法 sleep()方法是线程类&#xff08;Thread&#xff09;的静态方法&#xff0c;让调用的线程进入指定时间睡眠状态&#xff0c;使得当前线程进入阻塞状态。 当线程获取锁时&#xff0c;sleep()方法不会释放对象锁 wait()方法 wait()方法是Object类里的方法&#xff0c…

12个有趣的css库

12个有趣的css库 1. Animate Animate 是一个即用型跨浏览器动画库&#xff0c;可在我们的 Web 项目中使用。非常适合强调、主页、滑块和注意力引导提示。 2. Magic Magic里包含了一组简单的动画&#xff0c;可以在我们的Web或app项目中使用。 3. Animista Animista 是一个 …

【Linux系统编程】23.孤儿进程、僵尸进程、wait、waitpid

目录 孤儿进程 测试代码1 测试结果 僵尸进程 测试代码2 测试结果 wait 参数*wstatus 返回值 测试代码3 测试结果 测试代码4 测试结果 测试代码5 测试结果 waitpid 参数pid 参数*wstatus 参数options 返回值 测试代码6 测试结果 测试代码7 测试结果 测…

Zemax2019中文设置

做软件教程啥时候都不能少了切换中文版啊~ 正常打开软件&#xff1a; 点击setup 中的preference 弹出窗口&#xff1a; 选择general 在language的下拉窗口中选择&#xff0c;中文 效果&#xff1a;

实验篇——亚细胞定位

实验篇——亚细胞定位 文章目录 前言一、亚细胞定位的在线网站1. UniProt2. WoLFPSORT3. BUSCA4. TargetP-2.0 二、代码实现1. 基于UniProt&#xff08;不会&#xff09;2. 基于WoLFPSORT后续&#xff08;已完善&#xff0c;有关代码放置于[python爬虫学习&#xff08;一&#…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值&#xff0c;使用递归函数&#xff0c;求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据&#xff0c;对于每组输入数据&#xff0c; 按题目的要求输…

Java笔记-kafka

修改kafka的server.properties配置 概念 单播 一个消费组的消费者们只有一个能消费到消息。类似queue队列。 多播 不同的消费组的消费者能重复消费到消息&#xff0c;类似publish-subscribe模式 消费组偏移 kafka和别的消息中间件不一样&#xff0c;不同组可以重复消费&a…

Grafana监控 Redis Cluster

Grafana监控 Redis Cluster 主要是使用grafana来实现监控&#xff0c;grafana可以对接多种数据源&#xff0c;在官网中可以找到Redis数据源&#xff0c;需要安装redis data source插件。当然也可以利用Prometheus来做数据源&#xff0c;下面分别记录一下这两种数据源的安装配置…

前后端分离------后端创建笔记(04)前后端对接

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…

网络安全威胁与防御策略

第一章&#xff1a;引言 随着数字化时代的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷&#xff0c;给个人和企业带来了巨大的风险。本文…

UI美工设计岗位的基本职责概述(合集)

UI美工设计岗位的基本职责概述1 1、有良好的美术功底、设计新颖&#xff0c;整体配色及设计创意理念&#xff0c;能够独立完成整个网站页面设计及制作; 2、熟练运用DIV CSS&#xff0c;HTML 设计制作网页 ; 3、熟练运用Photoshop,Dreamweaver,Coreldraw(或Illustrator),Fla…

7-2 计算物体自由下落的距离

一个物体从100米的高空自由落下。编写程序&#xff0c;求它在前3秒内下落的垂直距离。设重力加速度为10米/秒2。 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出 height 垂直距离值结果保留2位小数。 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB …

异常(下)Java常见异常,异常的使用原则

文章目录 前言一、Java常见异常 1.常见异常2.实例展示二、异常的使用原则总结 前言 该文介绍了Java的一些常见异常&#xff0c;并给出对应的例子进行解释。介绍异常的使用原则&#xff0c;即创建&#xff0c;抛出异常的编程规范。 一、Java常见异常 前要&#xff1a;Java API中…

实训五:用户和组账号管理

实训五&#xff1a;用户和组账号管理 2017 年 X 月 X 日 今日公布 四&#xff1a;实训内容 用root用户登录系统&#xff0c;查看用户账号文件/etc/passwd和口令文件/etc/shadow的内容&#xff0c;注意观察其存储格式、各账户所使用的Shell、UID、GID等属性信息。 答&#xf…

ITIL4—度量和报告实践

1. 关于本文 本文为度量和报告实践提供了实用指南&#xff0c;分为五个主要部分&#xff0c;涵盖&#xff1a; 本实践的基本信息本实践相关的流程和活动&#xff0c;及其在服务价值链中的作用参与本实践的组织和人员支持本实践的信息和技术合作伙伴和供应商在本实践中的注意事…

【构造】CF1853D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;const int N 1e6 10;int ans[N];void solve() {int n;std::cin >> n;std::vector<std::pair<int,int> > a(n 1);for …

如何高效进行项目任务管理?掌握这些神器助你一臂之力

任务管理是项目管理中的重点部分&#xff0c;关系到项目能否顺利的完成。项目经理该如何进行项目任务管理呢&#xff1f; 一、项目任务管理中的挑战 二、项目任务管理指南 三、项目任务管理神器 首先我们需要先清楚当下企业在项目任务管理中遇到的挑战。 一、项目任务管理中的…