当前位置:首页 > Java

java 如何调用js

2026-02-04 18:54:23Java

调用 JavaScript 的常用方法

在 Java 中调用 JavaScript 代码可以通过多种方式实现,以下是几种常见的方法:

使用 ScriptEngine(Nashorn 引擎)

Java 内置了 Nashorn JavaScript 引擎(Java 8 及以下版本),可以通过 javax.script 包调用 JavaScript:

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

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

        try {
            engine.eval("print('Hello from JavaScript')");
            engine.eval("function add(a, b) { return a + b; }");
            Object result = engine.eval("add(5, 3)");
            System.out.println("Result: " + result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
}

使用 GraalVM 的 JavaScript 引擎

从 Java 11 开始,Nashorn 被标记为废弃,推荐使用 GraalVM 的 JavaScript 引擎:

import org.graalvm.polyglot.Context;

public class GraalJsCaller {
    public static void main(String[] args) {
        try (Context context = Context.create("js")) {
            context.eval("js", "print('Hello from GraalVM JavaScript')");
            context.eval("js", "function multiply(a, b) { return a * b; }");
            Number result = context.eval("js", "multiply(4, 5)").asNumber();
            System.out.println("Result: " + result);
        }
    }
}

通过 Rhino 库调用

对于较老版本的 Java(如 Java 7),可以使用 Mozilla 的 Rhino 引擎:

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;

public class RhinoJsCaller {
    public static void main(String[] args) {
        Context context = Context.enter();
        try {
            Scriptable scope = context.initStandardObjects();
            Object result = context.evaluateString(
                scope, 
                "function sub(x, y) { return x - y; }; sub(10, 2);",
                "js", 1, null);
            System.out.println("Result: " + Context.toNumber(result));
        } finally {
            Context.exit();
        }
    }
}

与浏览器交互(Selenium)

如果需要调用网页中的 JavaScript,可以使用 Selenium WebDriver:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class SeleniumJsCaller {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com");

        JavascriptExecutor js = (JavascriptExecutor) driver;
        Object result = js.executeScript("return document.title");
        System.out.println("Page title: " + result);

        driver.quit();
    }
}

注意事项

  • Nashorn 引擎在 Java 15 后被完全移除,后续版本需使用 GraalVM
  • GraalVM 需要单独安装并配置依赖
  • 涉及跨语言调用时需注意数据类型转换
  • 执行外部脚本时需处理安全性和异常情况

性能优化建议

对于频繁调用的 JavaScript 函数,可以预编译脚本:

java 如何调用js

// Nashorn 示例
Compilable compilingEngine = (Compilable) engine;
CompiledScript script = compilingEngine.compile("function(x) { return x * x; }");
Object result = script.eval();

通过选择合适的方法和优化手段,可以在 Java 应用中高效地集成 JavaScript 功能。

标签: javajs
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

如何编写java

如何编写java

编写Java程序的基本步骤 安装Java开发工具包(JDK),确保系统环境变量配置正确。可以从Oracle官网下载最新版本的JDK并进行安装。 选择一个合适的集成开发环境(IDE),如Eclipse…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…