java运行js代码

在 Java 中运行 JavaScript 代码可以通过 内置脚本引擎第三方库 实现。以下是具体方法和示例:


方法 1:使用 Java 内置的 ScriptEngine(Nashorn 引擎)

适用场景:简单脚本执行(JDK 8~14,JDK 15+ 已移除 Nashorn,需改用替代方案)。

步骤:
  1. 获取 JavaScript 引擎

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    public class RunJS {
        public static void main(String[] args) throws ScriptException {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            // 执行简单脚本
            engine.eval("print('Hello from JavaScript!');");
    
            // 传递变量到 JS
            engine.put("name", "Java");
            engine.eval("print('Hello ' + name);");
        }
    }
    
  2. 调用 JS 函数并获取返回值

    engine.eval("function add(a, b) { return a + b; }");
    Object result = engine.eval("add(3, 5);");
    System.out.println(result); // 输出 8
    

方法 2:使用 GraalVM 的 GraalJS(推荐)

适用场景:现代 JavaScript 支持(ES6+)、高性能需求(JDK 11+ 需通过 GraalVM 运行)。

步骤:
  1. 添加依赖(Maven)

    <dependency>
        <groupId>org.graalvm.jsgroupId>
        <artifactId>jsartifactId>
        <version>23.0.1version>
    dependency>
    <dependency>
        <groupId>org.graalvm.jsgroupId>
        <artifactId>js-scriptengineartifactId>
        <version>23.0.1version>
    dependency>
    
  2. 执行 JavaScript 代码

    import org.graalvm.polyglot.Context;
    
    public class GraalJSExample {
        public static void main(String[] args) {
            try (Context context = Context.create("js")) {
                // 执行脚本
                context.eval("js", "console.log('Hello from GraalJS!');");
    
                // 传递变量并获取结果
                context.getBindings("js").putMember("x", 10);
                context.getBindings("js").putMember("y", 20);
                Number sum = context.eval("js", "x + y").asNumber();
                System.out.println("Sum: " + sum); // 输出 30
            }
        }
    }
    

方法 3:调用外部 JavaScript 文件

// 读取外部 .js 文件并执行
try (Reader reader = new FileReader("script.js")) {
    engine.eval(reader);
}

常见问题解决

1. 错误处理
try {
    engine.eval("invalid JS code");
} catch (ScriptException e) {
    System.out.println("JS 执行错误: " + e.getMessage());
}
2. 性能优化
  • GraalVM 预编译:对频繁调用的 JS 代码预编译为字节码。
    Source source = Source.newBuilder("js", new File("script.js")).build();
    context.eval(source);
    
3. 沙箱安全

限制脚本权限(如禁止访问文件系统):

Context context = Context.newBuilder("js")
    .allowIO(false) // 禁用 IO 操作
    .allowHostAccess(HostAccess.NONE) // 禁止访问宿主环境
    .build();

方法对比

方案 优点 缺点
Nashorn JDK 内置,无需额外依赖 不支持 ES6+,JDK 15+ 已移除
GraalJS 高性能,支持最新 JS 特性 需要 GraalVM 或额外依赖
Rhino 兼容旧版本 Java 性能较差,功能有限

总结

  • 简单脚本:使用 Nashorn(JDK 8~14)。
  • 现代需求:选择 GraalJS(需 JDK 11+ 和 GraalVM)。
  • 安全场景:通过沙箱配置限制脚本权限。

你可能感兴趣的:(java,java,javascript,开发语言)