在Java代码中嵌入和执行JavaScript(JS)代码,是许多Java应用场景下的常见需求,例如动态脚本执行、规则引擎、配置化逻辑处理等,Java本身不直接支持JS语法,但通过一些成熟的库和工具,可以轻松实现Java与JS的交互,以下是几种主流的实现方式及其详细说明。

使用Nashorn引擎(Java 8及以上内置)
Java 8引入了Nashorn引擎,取代了早期的Rhino,成为JDK内置的JS运行时,Nashorn完全支持ECMAScript 5.1规范,并提供了与Java代码的无缝集成,使用Nashorn时,首先需要通过ScriptEngineManager获取Nashorn引擎实例,然后通过eval()方法执行JS代码。
import javax.script.*;
public class NashornExample {
public static void main(String[] args) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
// 执行简单JS表达式
engine.eval("var x = 10; var y = 20;");
engine.eval("print(x + y);"); // 输出: 30
// 调用Java方法
engine.eval("var System = Java.type('java.lang.System');");
engine.eval("System.out.println('Hello from Nashorn!');");
}
}
Nashorn的优势是无需额外依赖,适合简单的JS脚本执行,但需要注意的是,Java 9开始Nashorn被标记为废弃,Java 11中已被移除,因此在新项目中需谨慎使用。
使用GraalVM(现代高性能选择)
GraalVM是一个高性能的多语言运行时,支持在JVM上运行JavaScript、Python、Ruby等多种语言,其JS引擎(Graal.js)是Nashorn的现代替代品,性能更优且支持ES6+语法,使用GraalVM需要添加相关依赖:
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>22.3.0</version>
</dependency>
代码示例:

import org.graalvm.js.scripting.*;
public class GraalVmExample {
public static void main(String[] args) {
try (Context context = Context.create()) {
Value result = context.eval("js", "2 + 3");
System.out.println(result.asInt()); // 输出: 5
}
}
}
GraalVM支持更复杂的JS功能,如异步编程、与Java类的深度交互等,适合对性能和语法支持要求较高的场景。
通过Rhino引擎(旧版兼容方案)
Rhino是早期的开源JS引擎,虽然已被Nashorn和GraalVM取代,但在一些遗留系统中仍在使用,使用Rhino需要添加org.mozilla:rhino依赖,其API与Nashorn类似,但功能相对有限。
动态编译与执行JS文件
如果JS代码存储在外部文件中,可以通过读取文件内容后传递给引擎执行。
import java.nio.file.*;
public class JsFileExecutor {
public static void main(String[] args) throws Exception {
String jsCode = Files.readString(Paths.get("script.js"));
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(jsCode);
}
}
这种方式适合将业务逻辑与Java代码分离,实现动态配置。

注意事项与最佳实践
- 安全性:执行外部JS代码可能存在安全风险(如代码注入),建议在受限环境中运行,或使用沙箱机制。
- 性能优化:频繁创建引擎实例会影响性能,建议复用
ScriptEngine对象。 - 数据类型转换:Java与JS之间的数据类型转换需注意,如JS的
Object需转换为Java的Map或自定义对象。 - 依赖管理:根据项目需求选择合适的引擎,新项目优先考虑GraalVM,旧版Java可使用Nashorn。
在Java代码中执行JS脚本的核心是借助JS引擎,Nashorn、GraalVM和Rhino是常见选择,开发者需根据项目环境、性能需求和语法支持程度选择合适的方案,同时注意安全性和性能优化问题,通过合理利用这些工具,可以灵活扩展Java应用的功能,实现更动态的代码逻辑处理。




















