java腳本使用不同版本jdk的說明介紹
java腳本使用不同版本jdk的說明
在Java中,運(yùn)行或執(zhí)行JavaScript腳本有幾種方式,其中最常用的是通過Java內(nèi)置的JavaScript引擎(Nashorn或者Rhino)來執(zhí)行JavaScript代碼。
下面介紹幾種實(shí)現(xiàn)方式。
1.使用ScriptEngine執(zhí)行JavaScript
Java 在 JDK 6 中引入了javax.script包,這個(gè)包允許你在 Java 中使用腳本語言,包括 JavaScript。到 JDK 8 時(shí),Nashorn JavaScript 引擎取代了早期的 Rhino 引擎(jdk6以下版本)。
示例代碼:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JavaScriptExample {
public static void main(String[] args) {
// 創(chuàng)建ScriptEngineManager
ScriptEngineManager manager = new ScriptEngineManager();
// 獲取JavaScript引擎
ScriptEngine engine = manager.getEngineByName("JavaScript");
// 要執(zhí)行的JavaScript代碼
String script = "var x = 10; var y = 20; x + y;";
// 執(zhí)行JavaScript代碼
try {
Object result = engine.eval(script);
System.out.println("JavaScript結(jié)果: " + result);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}輸出:
JavaScript結(jié)果: 30
2.Nashorn(JDK 8及以上)和工具類
在Java 8中,Nashorn引擎是默認(rèn)的JavaScript引擎。Nashorn的性能比Rhino引擎更好,并且提供了更好的ES5標(biāo)準(zhǔn)的支持。
JDK 8 默認(rèn)使用 Nashorn。如果你在 JDK 11 或更高版本,Nashorn 可能被刪除,推薦使用其他方式(如 GraalVM)。
基于目前大多項(xiàng)目使用jdk8,給出如下詳細(xì)工具類可供使用。
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptUtil {
private final ScriptEngine engine;
public ScriptUtil() {
ScriptEngineManager manager = new ScriptEngineManager();
// 獲取Nashorn引擎實(shí)例
engine = manager.getEngineByName("nashorn");
}
// 執(zhí)行任意JavaScript代碼
public Object executeScript(String script) throws ScriptException {
return engine.eval(script);
}
// 執(zhí)行帶參數(shù)的JavaScript代碼
public Object executeScriptWithBindings(String script, Object... args) throws ScriptException {
// 設(shè)置腳本中的參數(shù)
for (int i = 0; i < args.length; i++) {
engine.put("arg" + i, args[i]);
}
return engine.eval(script);
}
// 調(diào)用JavaScript中的函數(shù)
public Object callFunction(String script, String functionName, Object... args) throws ScriptException, NoSuchMethodException {
// 先執(zhí)行包含函數(shù)定義的腳本
engine.eval(script);
// 獲取Invocable實(shí)例
Invocable invocable = (Invocable) engine;
// 調(diào)用指定的JavaScript函數(shù)
return invocable.invokeFunction(functionName, args);
}
public static void main(String[] args) {
try {
//JavaScriptExecutor executor = new JavaScriptExecutor();
ScriptUtil xbScriptUtil = new ScriptUtil();
// 執(zhí)行簡(jiǎn)單的JavaScript代碼
String script = "print('Hello, World!');";
Object object = xbScriptUtil.executeScript(script);
System.out.println(object);
// 執(zhí)行帶參數(shù)的JavaScript代碼
String scriptWithParams = "var result = arg0 + arg1; result;";
Object result = xbScriptUtil.executeScriptWithBindings(scriptWithParams, 5, 3);
System.out.println("Result with bindings: " + result);
// 調(diào)用JavaScript中的函數(shù)
String functionScript = "function add(a, b) { return a + b; }";
Object functionResult = xbScriptUtil.callFunction(functionScript, "add", 5, 3);
System.out.println("Function result: " + functionResult.toString());
String functionScript1 = "function calcData(val) { var val2='455'; return val+val2; }";
//傳入字符串
Object functionResult1 = xbScriptUtil.callFunction(functionScript1, "calcData", "222");
System.out.println("Function1 result: " + functionResult1.toString());
String functionScript2 = "function calcData(obj) { var val2=obj.getData('11','22'); return val2; }";
// 傳入對(duì)象參數(shù),調(diào)用函數(shù)
Object functionResult2 = xbScriptUtil.callFunction(functionScript2, "calcData", xbScriptUtil);
System.out.println("Function2 result: " + functionResult2.toString());
// System.out.println(xbScriptUtil.getData("1","2"));
} catch (ScriptException | NoSuchMethodException e) {
e.printStackTrace();
}
}
public String getData(String channelId, String pointId) {
return channelId + "#" + pointId;
}
}輸出:
Hello, World!
null
Result with bindings: 8.0
Function result: 8.0
Function1 result: 222455
Function2 result: 11#22
3.GraalVM(JDK 11及以上)
從JDK 11開始,Oracle現(xiàn)代允許刪除了Nashorn,引入了GraalVM多語言支持的更完整的方案。GraalVM作為在Java中高效執(zhí)行JavaScript、Python、R等多種語言。
使用GraalVM執(zhí)行JavaScript
需要使用GraalVM的polyglotAPI,下面是如何通過GraalVM執(zhí)行JavaScript代碼的示例。
示例代碼:
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>23.0.4</version> <!-- 請(qǐng)使用最新版本 -->
</dependency>import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;
public class GraalVMExample {
public static void main(String[] args) {
// 創(chuàng)建GraalVM上下文
try (Context context = Context.create()) {
// 執(zhí)行JavaScript代碼
Value result = context.eval("js", "var x = 10; var y = 20; x + y;");
System.out.println("JavaScript結(jié)果: " + result.asInt());
}
}
}輸出:
JavaScript結(jié)果: 30
總結(jié)
ScriptEngine (Nashorn/Rhino):適用于JDK 8及以下版本,適合簡(jiǎn)單的JavaScript腳本執(zhí)行。
GraalVM:推薦在JDK 11及以上使用,支持更多語言,并且性能更優(yōu)。
如果你在Java項(xiàng)目中需要集成或執(zhí)行大量復(fù)雜的JavaScript代碼,推薦使用GraalVM。如果只需要運(yùn)行少量簡(jiǎn)單的JavaScript代碼,可以繼續(xù)使用ScriptEngine。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)Base64圖片轉(zhuǎn)URL的完整方案
這篇文章主要介紹了如何使用Java實(shí)現(xiàn)Base64格式圖片轉(zhuǎn)換為可訪問的URL鏈接的過程,包括數(shù)據(jù)有效性校驗(yàn)、圖片壓縮、方向信息校正以及阿里云OSS存儲(chǔ)對(duì)接,核心實(shí)現(xiàn)代碼涵蓋了從獲取Base64圖片數(shù)據(jù)到上傳OSS的完整流程,需要的朋友可以參考下2025-11-11
springboot使用校驗(yàn)框架validation校驗(yàn)的示例
這篇文章主要介紹了springboot使用校驗(yàn)框架validation校驗(yàn)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
intellij idea中spring boot properties文件不能自動(dòng)提示問題解決
這篇文章主要介紹了intellij idea中spring boot properties文件不能自動(dòng)提示問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟
這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
Java代碼執(zhí)行shell命令的實(shí)現(xiàn)
這篇文章主要介紹了Java代碼執(zhí)行shell命令的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作
這篇文章主要介紹了java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02

