Java利用Hutool-Script封装JS脚本执行

 更新时间:2025年02月24日 09:31:16   作者:五行星辰  
在 Java 开发中,有时需要动态执行脚本代码,比如 JavaScript 脚本,来实现一些灵活的业务逻辑,下面我们就来看看如何利用Hutool-Script模块对Java的脚本执行功能进行封装吧

一、简介

在 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 脚本,该脚本定义了两个变量 a 和 b,并计算它们的和。然后使用 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 等脚本,为项目增加了更多的灵活性和动态性。

以上就是Java利用Hutool-Script封装JS脚本执行的详细内容,更多关于Java封装执行JS脚本的资料请关注脚本之家其它相关文章!

相关文章

  • java 字段值为null,不返回该字段的问题

    java 字段值为null,不返回该字段的问题

    这篇文章主要介绍了java 字段值为null,不返回该字段的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java字节码增强技术知识点详解

    Java字节码增强技术知识点详解

    在本篇文章里小编给大家整理的是一篇关于Java字节码增强技术知识点详解内容,有兴趣的朋友可以跟着学习下。
    2021-08-08
  • 运用java以及循环打印菱形详细实例代码

    运用java以及循环打印菱形详细实例代码

    最近在看算法书的时候,看到有打印上三角的算法,然后要举一反三,下面这篇文章主要介绍了运用java以及循环打印菱形的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • SpringCloud集成MybatisPlus实现MySQL多数据源配置方法

    SpringCloud集成MybatisPlus实现MySQL多数据源配置方法

    本文详细介绍了SpringCloud集成MybatisPlus实现MySQL多数据源配置的方法,包括在application.properties中配置多数据源,配置MybatisPlus,创建Mapper接口和使用多数据源等步骤,此外,还解释了每一个配置项目的含义,以便读者更好地理解和应用
    2024-10-10
  • java实现拼图游戏

    java实现拼图游戏

    这篇文章主要为大家详细介绍了java实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 了解java架构之微服务架构—雪崩效应

    了解java架构之微服务架构—雪崩效应

    这篇文章主要介绍了了解java架构之微服务架构—雪崩效应,微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,,需要的朋友可以参考下
    2019-06-06
  • Java多线程编程综合案例详解

    Java多线程编程综合案例详解

    这篇文章将通过三个案例带大家了解一下Java中的多线程编程,文中的示例代码介绍详细,对我们的学习或工作有一定的价值,感兴趣的小伙伴可以了解一下
    2022-07-07
  • 关于Java大整数运算之BigInteger类

    关于Java大整数运算之BigInteger类

    这篇文章主要介绍了关于Java大整数运算之BigInteger类,BigInteger提供高精度整型数据类型及相关操作,所有操作中,都以二进制补码形式表示,需要的朋友可以参考下
    2023-05-05
  • Spring Boot 整合 MyBatis 连接数据库及常见问题

    Spring Boot 整合 MyBatis 连接数据库及常见问题

    MyBatis 是一个优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射,下面详细介绍如何在 Spring Boot 项目中整合 MyBatis 并连接数据库,感兴趣的朋友一起看看吧
    2025-03-03
  • Java后端WebSocket的Tomcat实现

    Java后端WebSocket的Tomcat实现

    这篇文章主要介绍了Java后端WebSocket的Tomcat实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06

最新评论