java 如何调用js
调用 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 函数,可以预编译脚本:
// Nashorn 示例
Compilable compilingEngine = (Compilable) engine;
CompiledScript script = compilingEngine.compile("function(x) { return x * x; }");
Object result = script.eval();
通过选择合适的方法和优化手段,可以在 Java 应用中高效地集成 JavaScript 功能。







