最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java腳本使用不同版本jdk的說明介紹

 更新時(shí)間:2025年01月22日 09:54:24   作者:碼靈  
本文介紹了在Java中執(zhí)行JavaScript腳本的幾種方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine適用于JDK8及以下版本,而Nashorn和GraalVM分別推薦在JDK8及以上和JDK11及以上使用,后者支持更多語言并性能更優(yōu)

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的完整方案

    這篇文章主要介紹了如何使用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)的示例

    這篇文章主要介紹了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)提示問題解決

    這篇文章主要介紹了intellij idea中spring boot properties文件不能自動(dòng)提示問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java對(duì)ArrayList排序代碼示例

    java對(duì)ArrayList排序代碼示例

    本文通過代碼示例給大家介紹java對(duì)arraylist排序,代碼簡(jiǎn)潔易懂,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟

    MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟

    這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • 使用java的milo框架訪問OPCUA服務(wù)的過程

    使用java的milo框架訪問OPCUA服務(wù)的過程

    這篇文章主要介紹了使用java的milo框架訪問OPCUA服務(wù)的方法,本次采用KEPServerEX5模擬服務(wù)端,使用milo開發(fā)的程序作為客戶端,具體操作使用過程跟隨小編一起看看吧
    2022-01-01
  • SpringBoot跨域問題的解決方法實(shí)例

    SpringBoot跨域問題的解決方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于SpringBoot跨域問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java代碼執(zhí)行shell命令的實(shí)現(xiàn)

    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中-classpath和路徑的使用

    詳解Java中-classpath和路徑的使用

    本篇文章主要介紹了Java中-classpath和路徑的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作

    java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作

    這篇文章主要介紹了java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

德安县| 永善县| 建始县| 惠来县| 灌阳县| 溆浦县| 平乡县| 三门峡市| 庐江县| 龙胜| 德安县| 武清区| 黎川县| 榆林市| 抚顺市| 信阳市| 龙口市| 弥渡县| 长子县| 富川| 隆林| 迭部县| 杭锦后旗| 海口市| 孝感市| 灵川县| 定陶县| 始兴县| 乐山市| 梅州市| 若尔盖县| 乳源| 丹棱县| 漳浦县| 崇明县| 蒲城县| 普安县| 耒阳市| 海兴县| 察雅县| 马尔康县|