java 实现js
在 Java 中实现 JavaScript 功能
Java 可以通过调用 JavaScript 引擎来执行 JavaScript 代码,常用的引擎包括 Nashorn(JDK 8-14)和 GraalVM(JDK 15+)。以下是具体实现方法。
使用 Nashorn 引擎(JDK 8-14)
Nashorn 是 JDK 8 到 14 中内置的 JavaScript 引擎,可以直接调用。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class NashornExample {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
try {
engine.eval("var result = 10 + 20;");
Object result = engine.eval("result;");
System.out.println("Result: " + result);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
使用 GraalVM 引擎(JDK 15+)
从 JDK 15 开始,Nashorn 被移除,推荐使用 GraalVM 的 JavaScript 引擎。
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;
public class GraalVMExample {
public static void main(String[] args) {
try (Context context = Context.create()) {
Value result = context.eval("js", "10 + 20");
System.out.println("Result: " + result.asInt());
}
}
}
在 Java 中调用 JavaScript 函数
可以通过 eval 方法定义 JavaScript 函数,并在 Java 中调用。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JsFunctionExample {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
try {
engine.eval("function add(a, b) { return a + b; }");
Object result = engine.eval("add(10, 20);");
System.out.println("Result: " + result);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
在 Java 和 JavaScript 之间传递数据
可以通过 Bindings 对象在 Java 和 JavaScript 之间共享变量。
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class DataPassingExample {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
Bindings bindings = engine.createBindings();
bindings.put("x", 10);
bindings.put("y", 20);
try {
Object result = engine.eval("x + y", bindings);
System.out.println("Result: " + result);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
使用 GraalVM 实现更复杂的交互
GraalVM 支持多语言交互,可以在 Java 中直接调用 JavaScript 函数并传递复杂对象。
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;
public class GraalVMComplexExample {
public static void main(String[] args) {
try (Context context = Context.create()) {
context.eval("js", "function greet(name) { return 'Hello, ' + name; }");
Value greetFunction = context.getBindings("js").getMember("greet");
String result = greetFunction.execute("World").asString();
System.out.println(result);
}
}
}
注意事项
- Nashorn 在 JDK 15 及以上版本中已被移除,建议使用 GraalVM。
- GraalVM 需要单独安装或使用 GraalVM 提供的 JDK。
- 性能敏感场景下,直接调用 JavaScript 可能不如原生 Java 代码高效。
通过以上方法,可以在 Java 中灵活调用和执行 JavaScript 代码,实现跨语言功能集成。







