java腳本使用不同版本jdk的說明介紹
java腳本使用不同版本jdk的說明
在Java中,運行或執(zhí)行JavaScript腳本有幾種方式,其中最常用的是通過Java內(nèi)置的JavaScript引擎(Nashorn或者Rhino)來執(zhí)行JavaScript代碼。
下面介紹幾種實現(xiàn)方式。
1.使用ScriptEngine執(zhí)行JavaScript
Java 在 JDK 6 中引入了javax.script包,這個包允許你在 Java 中使用腳本語言,包括 JavaScript。到 JDK 8 時,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引擎是默認的JavaScript引擎。Nashorn的性能比Rhino引擎更好,并且提供了更好的ES5標(biāo)準(zhǔn)的支持。
JDK 8 默認使用 Nashorn。如果你在 JDK 11 或更高版本,Nashorn 可能被刪除,推薦使用其他方式(如 GraalVM)。
基于目前大多項目使用jdk8,給出如下詳細工具類可供使用。
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引擎實例 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實例 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í)行簡單的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; }"; // 傳入對象參數(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> <!-- 請使用最新版本 --> </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及以下版本,適合簡單的JavaScript腳本執(zhí)行。
GraalVM:推薦在JDK 11及以上使用,支持更多語言,并且性能更優(yōu)。
如果你在Java項目中需要集成或執(zhí)行大量復(fù)雜的JavaScript代碼,推薦使用GraalVM。如果只需要運行少量簡單的JavaScript代碼,可以繼續(xù)使用ScriptEngine。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java創(chuàng)建型設(shè)計模式之抽象工廠模式(Abstract?Factory)
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象,而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要使用抽象工廠模式,抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)2022-09-09spring boot使用logback實現(xiàn)多環(huán)境日志配置詳解
這篇文章主要介紹了spring boot使用logback實現(xiàn)多環(huán)境日志配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08Mybatis查詢Sql結(jié)果未映射到對應(yīng)得實體類上的問題解決
使用mybatis查詢表數(shù)據(jù)得時候,發(fā)現(xiàn)對應(yīng)得實體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結(jié)果未映射到對應(yīng)得實體類上的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-02-02SpringMVC @ResponseBody 415錯誤處理方式
這篇文章主要介紹了SpringMVC @ResponseBody 415錯誤處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringCloud整合OpenFeign實現(xiàn)微服務(wù)間的通信
微服務(wù)之間的通信?式,通常有兩種: RPC 和 HTTP,在SpringCloud中, 默認是使?HTTP來進?微服務(wù)的通信, 最常?的實現(xiàn)形式有兩種:RestTemplate和OpenFeign,本文給大家介紹了SpringCloud整合OpenFeign實現(xiàn)微服務(wù)間的通信,需要的朋友可以參考下2024-06-06