当前位置:首页 > Java

java 如何调用js

2026-02-04 18:54:23Java

调用 JavaScript 的常用方法

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

使用 ScriptEngine(Nashorn 引擎)

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

java 如何调用js

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 引擎:

java 如何调用js

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 函数,可以预编译脚本:

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

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

标签: javajs
分享给朋友:

相关文章

java如何打开

java如何打开

安装Java开发环境 下载并安装Java Development Kit (JDK),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME和PATH变量正…

java程序如何运行

java程序如何运行

编写Java代码 使用文本编辑器或IDE(如IntelliJ IDEA、Eclipse)编写Java源代码,保存为.java文件。例如: public class HelloWorld {…

js实现防洪

js实现防洪

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

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…

java如何生成随机数

java如何生成随机数

生成随机数的方法 在Java中生成随机数可以通过多种方式实现,以下是几种常见的方法: 使用Math.random()方法 Math.random()方法返回一个double类型的伪随机数,范围在[0…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…