当前位置: 首页 > news >正文

Hutool - Script:脚本执行封装,以 JavaScript 为例

一、简介

在 Java 开发中,有时需要动态执行脚本代码,比如 JavaScript 脚本,来实现一些灵活的业务逻辑,如动态规则计算、数据处理等。Java 本身提供了 javax.script 包来支持脚本执行,但使用起来较为繁琐。Hutool - Script 模块对 Java 的脚本执行功能进行了封装,提供了更简洁易用的 API,让开发者可以方便地执行各种脚本,这里主要介绍 JavaScript 脚本的执行。

二、引入依赖

如果你使用 Maven 项目,在 pom.xml 中添加以下依赖:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

若使用 Gradle 项目,在 build.gradle 中添加:

implementation 'cn.hutool:hutool-all:5.8.16'
三、基本使用示例
1. 执行简单的 JavaScript 脚本
import cn.hutool.script.ScriptUtil;public class SimpleScriptExecution {public static void main(String[] args) {// 定义 JavaScript 脚本String script = "var a = 5; var b = 3; a + b;";// 执行脚本并获取结果Object result = ScriptUtil.eval(script);System.out.println("脚本执行结果: " + result);}
}

在上述代码中,首先定义了一个简单的 JavaScript 脚本,该脚本定义了两个变量 ab,并计算它们的和。然后使用 ScriptUtil.eval 方法执行该脚本,该方法会返回脚本执行的结果,最后将结果输出。

2. 执行带函数调用的 JavaScript 脚本
import cn.hutool.script.ScriptUtil;public class FunctionScriptExecution {public static void main(String[] args) {// 定义包含函数的 JavaScript 脚本String script = "function add(a, b) { return a + b; } add(7, 8);";// 执行脚本并获取结果Object result = ScriptUtil.eval(script);System.out.println("函数调用脚本执行结果: " + result);}
}

这里定义了一个 JavaScript 函数 add 用于计算两个数的和,然后调用该函数并传入参数。同样使用 ScriptUtil.eval 方法执行脚本并获取结果。

四、向脚本传递参数
1. 传递单个参数
import cn.hutool.script.ScriptUtil;import javax.script.ScriptException;
import java.util.HashMap;
import java.util.Map;public class PassSingleParameter {public static void main(String[] args) throws ScriptException {// 定义 JavaScript 脚本,使用传入的参数String script = "var num = param * 2; num;";// 定义参数Map<String, Object> params = new HashMap<>();params.put("param", 10);// 执行脚本并传递参数Object result = ScriptUtil.eval(script, params);System.out.println("传递单个参数脚本执行结果: " + result);}
}

在这个示例中,脚本中使用了一个名为 param 的参数,通过 Map 对象将参数传递给 ScriptUtil.eval 方法,脚本会使用传入的参数进行计算并返回结果。

2. 传递多个参数
import cn.hutool.script.ScriptUtil;import javax.script.ScriptException;
import java.util.HashMap;
import java.util.Map;public class PassMultipleParameters {public static void main(String[] args) throws ScriptException {// 定义 JavaScript 脚本,使用传入的多个参数String script = "var sum = param1 + param2; sum;";// 定义参数Map<String, Object> params = new HashMap<>();params.put("param1", 5);params.put("param2", 6);// 执行脚本并传递参数Object result = ScriptUtil.eval(script, params);System.out.println("传递多个参数脚本执行结果: " + result);}
}

与传递单个参数类似,通过 Map 对象可以传递多个参数给脚本,脚本可以使用这些参数进行相应的计算。

五、处理脚本异常

在执行脚本时,可能会出现各种异常,如语法错误、类型错误等。Hutool - Script 会将脚本执行过程中的异常抛出,开发者可以进行捕获和处理。

import cn.hutool.script.ScriptUtil;import javax.script.ScriptException;public class ScriptExceptionHandling {public static void main(String[] args) {// 定义包含语法错误的 JavaScript 脚本String script = "var a = 5; var b = 3; a + b; // 故意添加语法错误: ;;;";try {// 执行脚本Object result = ScriptUtil.eval(script);System.out.println("脚本执行结果: " + result);} catch (ScriptException e) {System.err.println("脚本执行出错: " + e.getMessage());}}
}

在上述代码中,脚本包含语法错误,使用 try - catch 块捕获 ScriptException 异常,并输出异常信息,方便开发者进行调试。

六、注意事项
  • 脚本安全:执行外部传入的脚本时,要注意脚本的安全性,避免执行恶意脚本导致安全漏洞,如注入攻击等。
  • 性能考虑:频繁执行脚本可能会影响程序的性能,尤其是复杂的脚本。在性能敏感的场景下,要谨慎使用脚本执行功能。
  • 脚本引擎选择:Hutool - Script 默认使用 Java 内置的脚本引擎,对于 JavaScript 脚本,使用的是 Nashorn 引擎(Java 8 及以前)或 GraalVM JavaScript 引擎(Java 11 及以后)。如果需要更高性能或特定功能,可以考虑使用其他脚本引擎。

通过使用 Hutool - Script,开发者可以方便地在 Java 项目中执行 JavaScript 等脚本,为项目增加了更多的灵活性和动态性。

相关文章:

Hutool - Script:脚本执行封装,以 JavaScript 为例

一、简介 在 Java 开发中&#xff0c;有时需要动态执行脚本代码&#xff0c;比如 JavaScript 脚本&#xff0c;来实现一些灵活的业务逻辑&#xff0c;如动态规则计算、数据处理等。Java 本身提供了 javax.script 包来支持脚本执行&#xff0c;但使用起来较为繁琐。Hutool - Sc…...

【开源项目】分布式文本多语言翻译存储平台

分布式文本多语言翻译存储平台 地址&#xff1a; Gitee&#xff1a;https://gitee.com/dreamPointer/zza-translation/blob/master/README.md 一、提供服务 分布式文本翻译服务&#xff0c;长文本翻译支持流式回调&#xff08;todo&#xff09;分布式文本多语言翻译结果存储服…...

小智机器人CMakeLists编译文件解析

编译完成后&#xff0c;成功烧录&#xff01; 这段代码是一个CMake脚本&#xff0c;用于配置和构建一个嵌入式项目&#xff0c;特别是针对ESP32系列芯片的项目。CMake是一个跨平台的构建系统&#xff0c;用于管理项目的编译过程。 set(SOURCES "audio_codecs/audio_code…...

SOME/IP--协议英文原文讲解11

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.6 Er…...

python~http的请求参数中携带map

背景 调试 http GET请求的 map 参数&#xff0c;链路携带参数一直有问题&#xff0c;最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...

深研究:与Dify建立研究自动化应用

许多个人和团队面临筛选各种网页或内部文档的挑战,以全面概述一个主题。那么在这里我推荐大家使用Dify,它是一个用于LLM应用程序开发的低代码,开源平台,它通过自动化工作流程的多步搜索和有效汇总来解决此问题,仅需要最小的编码。 在本文中,我们将创建“ Deepresearch”…...

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…...

Http模块及练习

### 作业 1. 静态文件服务器 js const http await import(http) const fs await import(fs) const proc ((req,res)>{ let file ./public${req.url} let FilePath file.replace(favicon.ico,"") // 检查文件是否存在 if (!fs.existsSync(FilePa…...

计算机视觉行业洞察--影像行业系列第一期

计算机视觉行业产业链的上下游构成相对清晰&#xff0c;从基础技术研发到具体应用场景的多个环节相对成熟。 以下是我结合VisionChina经历和行业龙头企业对计算机视觉行业产业链上下游的拆解总结。 上下游总结 上游产业链分为软硬件两类&#xff0c;视觉的硬件主要指芯片、…...

C语言番外篇(3)------------>break、continue

看到我的封面图的时候&#xff0c;部分读者可能认为这和编程有什么关系呢&#xff1f; 实际上这个三个人指的是本篇文章有三个部分组成。 在之前的博客中我们提及到了while循环和for循环&#xff0c;在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for…...

【NLP 31、预训练模型的发展过程】

人的行为&#xff0c;究竟是人所带来的思维方式不同还是与机器一样&#xff0c;刻在脑海里的公式呢&#xff1f; 只是因为不同的人公式不同&#xff0c;所以人的行为才不同&#xff0c;可这又真的是人引以为傲的意识吗&#xff1f; 人脑只是相当于一个大型、驳杂的处理器&#…...

sqlclchery面对复杂的sql语句怎么办

面对复杂的SQL语句时&#xff0c;可以采取以下步骤来简化和解决问题&#xff1a; 理解需求 明确查询的目标&#xff0c;确保清楚需要获取哪些数据。 分解查询 将复杂查询拆分为多个简单部分&#xff0c;逐步构建最终结果。 使用注释 添加注释&#xff0c;解释每个部分的逻辑&…...

C++/JavaScript ⭐算法OJ⭐下一个排列

题目描述 31. Next Permutation A permutation of an array of integers is an arrangement of its members into a sequence or linear order. For example, for arr [1,2,3], the following are all the permutations of arr: [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]…...

《Mycat核心技术》第17章:实现MySQL的读写分离

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…...

Windows 11 使用容器(Docker Podman)

文章目录 背景1、相关网站1.1、WSL1.2、Docker1.3、Podman 2、环境3、安装部署3.1、安装 WSL3.2、Docker3.2.1、Docker Desktop3.2.1.1、安装3.2.1.2、拉取镜像3.2.1.3、启动容器 3.3、Podman3.3.1、安装3.3.2、使用3.3.3、异常处理 总结 背景 Windows 系统中使用容器&#xf…...

代码审计入门学习之sql注入

路由规则 入口文件&#xff1a;index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互联网站内容管理系统 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …...

2024信息技术、信息安全、网络安全、数据安全等国家标准合集共125份。

2024信息技术、信息安全、网络安全、数据安全等国家标准合集&#xff0c;共125份。 一、2024信息技术标准&#xff08;54份&#xff09; GB_T 17966-2024 信息技术 微处理器系统 浮点运算.pdf GB_T 17969.8-2024 信息技术 对象标识符登记机构操作规程 第8部分&#xff1a;通用…...

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…...

文档检索服务平台

文档检索服务平台是基于Elasticsearch的全文检索&#xff0c;包含数据采集、数据清洗、数据转换、数据检索等模块。 项目地址&#xff1a;Github、国内Gitee 演示地址&#xff1a;http://silianpan.cn/gdss/ 以下是演示角色和账号&#xff08;密码同账号&#xff09;&#xf…...

使用FastAPI进行可视化部署

文章目录 一、FastAPI介绍二、环境配置三、示例代码1.app.py代码如下2.websocket_handler.py 代码如下3.运行app4.遇到的问题与解决 一、FastAPI介绍 FastAPI是一个高性能的Python Web框架&#xff0c;它基于Starlette并利用了 Python类型提示的优势。它可以帮助我们快速构建具…...

Liunx创建挂载步骤

1. 查看磁盘情况lsblk # 查看所有块设备 fdisk -l # 查看磁盘分区详情&#xff08;需 root&#xff09;2. 分区&#xff08;以 /dev/sdb 为例&#xff09;fdisk /dev/sdb进入交互界面后&#xff1a;n → 新建分区p → 主分区&#xff08;或 e 扩展分区&#xff09;回车接受默认…...

从‘No tests found’错误出发,聊聊Maven项目里测试代码到底该放哪儿(附最佳实践)

从‘No tests found’错误出发&#xff0c;聊聊Maven项目里测试代码到底该放哪儿&#xff08;附最佳实践&#xff09; 在Java开发的世界里&#xff0c;Maven项目结构就像是一座精心设计的图书馆&#xff0c;而src/main和src/test则是其中最重要的两个分区。但当我们把测试代码…...

Tkinter Scrollbar配置避坑指南:为什么你的滚动条点了没反应?

Tkinter Scrollbar配置避坑指南&#xff1a;为什么你的滚动条点了没反应&#xff1f; 第一次在Tkinter里实现滚动条功能时&#xff0c;那种点击滑块却纹丝不动的挫败感&#xff0c;相信很多开发者都经历过。明明按照教程一步步配置了yscrollcommand和command&#xff0c;运行时…...

“Webinar Replay: Spring with Immutability” 指的是一场已录制回放的技术网络研讨会(Webinar)

“Webinar Replay: Spring with Immutability” 指的是一场已录制回放的技术网络研讨会&#xff08;Webinar&#xff09;&#xff0c;主题聚焦于在 Spring 框架中如何有效应用**不可变性&#xff08;Immutability&#xff09;**原则。该主题通常涵盖&#xff1a; 不可变对象的设…...

WindowResizer终极指南:快速掌握Windows窗口强制调整技巧

WindowResizer终极指南&#xff1a;快速掌握Windows窗口强制调整技巧 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为无法调整某些软件窗口大小而烦恼吗&#xff1f;WindowR…...

告别Unity打包卡顿:手动指定本地Gradle版本完整指南(以Gradle-6.1.1为例)

深度优化Unity构建流程&#xff1a;精准控制Gradle版本的完整实践指南 如果你曾经在Unity打包Android应用时遭遇过"Building Gradle project"卡顿的噩梦&#xff0c;那么这篇文章正是为你准备的。作为一名经历过无数次构建失败的开发者&#xff0c;我深知那种看着进度…...

Magpie v0.12.1:让Windows窗口缩放体验焕然一新的秘密武器

Magpie v0.12.1&#xff1a;让Windows窗口缩放体验焕然一新的秘密武器 【免费下载链接】Magpie A general-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 还在为Windows系统下窗口放大后画面模糊、游戏拉伸失真、办…...

DoL汉化美化整合包构建指南:5分钟掌握自动化打包技巧

DoL汉化美化整合包构建指南&#xff1a;5分钟掌握自动化打包技巧 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS DoL-Lyra 构建系统是一个专为 Degrees of Lewdity 游戏打造的自动化打包工具&#x…...

什么是补丁更新的“双缓冲区”?深度探讨虚拟 DOM 的状态同步机制

“补丁更新的双缓冲区”是类比图形学双缓冲对虚拟DOM状态隔离与原子切换机制的描述&#xff1a;旧新虚拟DOM结构分离、diff延迟应用、更新具原子性&#xff0c;并借异步调度解耦计算与渲染。“补丁更新的双缓冲区”并不是一个标准术语&#xff0c;它其实是对虚拟 DOM 更新过程中…...

用Lottie动画和LeanCloud,给你的React Native登录页加点‘魔法’(附完整代码)

用Lottie动画和LeanCloud打造React Native登录页的视觉魔法 在移动应用的世界里&#xff0c;第一印象决定一切。一个枯燥的登录页面可能会让用户对你的应用产生负面印象&#xff0c;而一个精心设计的交互体验则能瞬间提升品牌形象。作为React Native开发者&#xff0c;我们拥有…...