如何在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
相关产品推荐
相关产品推荐

