You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java8中使用Nashorn执行JS文件并在类内调用JavaScript

嘿,我来帮你搞定Java 8里用Nashorn执行JavaScript的需求!其实Nashorn的用法挺直观的,我分两个核心场景给你一步步讲清楚:

1. Java执行外部JavaScript文件

如果你有单独的.js文件要执行,用Nashorn的ScriptEngine就能轻松搞定,步骤如下:

  • 首先通过ScriptEngineManager获取Nashorn引擎实例
  • 读取你的JavaScript文件并传入引擎执行
  • 处理可能出现的脚本异常和IO异常

给你个完整的代码示例:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileReader;
import java.io.IOException;

public class NashornFileExecution {
    public static void main(String[] args) {
        // 获取Nashorn脚本引擎
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine nashorn = manager.getEngineByName("nashorn");

        try {
            // 执行外部JS文件(这里替换成你的JS文件路径)
            nashorn.eval(new FileReader("path/to/your/script.js"));
        } catch (ScriptException e) {
            System.err.println("执行JS脚本时出错: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("读取JS文件时出错: " + e.getMessage());
        }
    }
}
2. Java类中直接调用JavaScript代码(或JS函数)

如果想在Java里直接调用JS代码片段,甚至调用JS里定义的函数,那Invocable接口会帮上大忙——它是ScriptEngine的子接口,支持调用脚本里的函数。

示例1:执行JS代码片段

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class NashornCodeSnippet {
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine nashorn = manager.getEngineByName("nashorn");

        try {
            // 直接执行JS代码片段
            String jsCode = "var message = 'Hello from Nashorn!'; print(message);";
            nashorn.eval(jsCode);

            // 还能获取JS里的变量到Java中
            String jsMessage = (String) nashorn.get("message");
            System.out.println("Java中获取到的JS变量: " + jsMessage);
        } catch (ScriptException e) {
            System.err.println("执行JS代码出错: " + e.getMessage());
        }
    }
}

示例2:调用JS中定义的函数

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class NashornFunctionCall {
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine nashorn = manager.getEngineByName("nashorn");

        try {
            // 先定义一个JS函数
            String jsFunction = "function add(a, b) { return a + b; }";
            nashorn.eval(jsFunction);

            // 将引擎转为Invocable接口,调用JS函数
            Invocable invocable = (Invocable) nashorn;
            // 调用add函数,传入参数,获取返回值
            Integer result = (Integer) invocable.invokeFunction("add", 10, 20);
            System.out.println("JS函数add的执行结果: " + result);
        } catch (ScriptException e) {
            System.err.println("定义JS函数出错: " + e.getMessage());
        } catch (NoSuchMethodException e) {
            System.err.println("找不到指定的JS函数: " + e.getMessage());
        }
    }
}
一些注意事项
  • Nashorn是Java 8的默认JavaScript引擎,从Java 11开始被移除了,所以你用Java 8完全没问题
  • 如果需要传递复杂的Java对象给JS,直接传入即可,Nashorn会自动处理类型转换
  • 要是JS里需要调用Java的类或方法,也可以通过Java.type()在JS中引入,比如var ArrayList = Java.type('java.util.ArrayList');

这样应该就能覆盖你的需求了,要是还有细节问题可以再深挖!

内容的提问来源于stack exchange,提问作者Sumit Sood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:09