亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java詳解ScriptEngine接口動態(tài)執(zhí)行JS腳本

 更新時間:2022年08月08日 11:10:09   作者:Cavewang  
ScriptEngine是基本接口,其方法必須在本規(guī)范的每個實現(xiàn)中完全起作用。這些方法提供基本腳本功能。 寫入這個簡單接口的應(yīng)用程序可以在每個實現(xiàn)中進行最少的修改。 它包括執(zhí)行腳本的方法,以及設(shè)置和獲取值的方法

大多的方法描述都來自于jdk11API幫助文檔,由于是機翻,可能有些難以理解,大家多多擔(dān)待

簡介

首先來看一下JDK11API文檔中對ScriptEngine的描述

模塊 java.scripting

軟件包 javax.script

Interface ScriptEngin

public interface ScriptEngine

ScriptEngine是基本接口,其方法必須在本規(guī)范的每個實現(xiàn)中完全起作用。

這些方法提供基本腳本功能。 寫入這個簡單接口的應(yīng)用程序可以在每個實現(xiàn)中進行最少的修改。 它包括執(zhí)行腳本的方法,以及設(shè)置和獲取值的方法。

值是兩種類型的鍵/值對。 第一類對包括其密鑰在本說明書中保留和定義的那些或由各個實現(xiàn)組成。 具有保留鍵的對中的值具有指定的含義。

另一種類型的對包括那些創(chuàng)建Java語言綁定的對,這些值通常由腳本中的相應(yīng)鍵或它們的裝飾形式表示。

Eval(String script)

eval方法有多個重載,本文只介紹最常用的Eval(String script)

描述

執(zhí)行指定的腳本。

實例代碼

    /**
     * ScriptEngine.eval()
     */
    public void jsEngineEvalTest() {
        ScriptEngineManager sem = new ScriptEngineManager();
        //查找并為給定的擴展創(chuàng)建ScriptEngine。也可用getEngineByName,查找并為給定名稱創(chuàng)建ScriptEngine 
        ScriptEngine jsEngine = sem.getEngineByExtension("js");
        try {
            jsEngine.eval("var array = [1, 2, 3, 4, 5];for (var i = 0; i < array.length; i++) {print('index:' + i + ',value:' + array[i]);}");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

執(zhí)行的腳本很簡單,遍歷輸出了一個數(shù)組

結(jié)果如下所示:

index:0,value:1
index:1,value:2
index:2,value:3
index:3,value:4
index:4,value:5

Put() and Get()

描述

void put?(String key, Object value) : 設(shè)置ScriptEngine狀態(tài)中的鍵/值對,可以創(chuàng)建用于執(zhí)行腳本的Java語言綁定,也可以以其他方式使用,具體取決于是否保留鍵。

Object get?(String key) : 檢索在此引擎狀態(tài)下設(shè)置的值。 該值可能是其中之一是使用設(shè)置setValue或狀態(tài)的其他值ScriptEngine ,取決于實施。

實例代碼

    /**
     * ScriptEngine.put() and ScriptEngine.get()
     */
    public void jsEnginePutTest(){
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        //向engine中存值
        engine.put("str", "jsEnginePutTest");
        try {
            engine.eval("var output ='' ;for (i = 0; i <= str.length; i++) {  output = str.charAt(i) + output }");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        //從engine中取值
        String name = (String) engine.get("output");
        System.out.println("被翻轉(zhuǎn)后的字符串:"+name);
    }

此處的js腳本是將str字符串進行翻轉(zhuǎn)操作,結(jié)果如下

被翻轉(zhuǎn)后的字符串:tseTtuPenignEsj

CompiledScript

描述

通過存儲編譯結(jié)果的類進行擴展。 狀態(tài)可以以Java類,Java類文件或腳本語言操作碼的形式存儲。 腳本可以重復(fù)執(zhí)行而無需重新分析。

我的理解:將ScriptEngine解析一段腳本的結(jié)果存起來,方便多次調(diào)用。但是使用時要先將ScriptEngine用Compilable接口強制轉(zhuǎn)換,然后調(diào)用compile(String script)方法就能返回一個CompiledScript對象,下次使用的時候調(diào)用一下CompiledScript.eval()即可,以此可以省略每次使用腳本都要重新解析一遍的過程。

實例代碼

    /**
     * CompiledScript
     */
    public void compiledScriptTest(){
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        //進行強制轉(zhuǎn)換
        Compilable compilable = (Compilable) engine;
        String script = "print('CompiledScriptTest')";
        try {
        	//腳本解析結(jié)果存到JSFunction中,下次使用時用jsFunction.eval()即可
            CompiledScript jsFunction = compilable.compile(script);
            jsFunction.eval();
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

此處js腳本只是進行一個簡單的輸出,結(jié)果如下:

CompiledScriptTest

Bindings

描述

沒有找到對Bindings很準(zhǔn)確的解釋,這里寫下查閱了很多碼友的筆記后我的得出的結(jié)論,Bindings是一個用來存放數(shù)據(jù)的容器,它有3個層級,為Global級、Engine級和Local級,前2者通過ScriptEngine.getBindings()獲得,是唯一的對象,而Local Binding由ScriptEngine.createBindings()獲得,很好理解,每次都產(chǎn)生一個新的。Global對應(yīng)到工廠,Engine對應(yīng)到ScriptEngine,向這2者里面加入任何數(shù)據(jù)或者編譯后的腳本執(zhí)行對象,在每一份新生成的Local Binding里面都會存在。

實例代碼

    /**
     * Bindings
     */
    public void jsEngineBindingsTest(){
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
        Compilable compilable = (Compilable) engine;
        Bindings bindings = engine.createBindings();
        String script = "function add(num1,num2){return num1+num2} add(a, b)";
        CompiledScript JSFunction = null;
        try {
            JSFunction = compilable.compile(script);
            //向bingdings中傳入鍵值對
            bindings.put("a", 1);
            bindings.put("b", 2);
            //調(diào)用eval時將bindings也傳入
            Object result = JSFunction.eval(bindings);
            System.out.println(result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

此處腳本代碼進行了一個簡單的加法運算,結(jié)果如下:

3.0

到此這篇關(guān)于Java詳解ScriptEngine接口動態(tài)執(zhí)行JS腳本的文章就介紹到這了,更多相關(guān)Java ScriptEngine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring JDBCTemplate原理及使用實例

    Spring JDBCTemplate原理及使用實例

    這篇文章主要介紹了Spring JDBCTemplate原理及使用實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Spring Boot和Vue跨域請求問題原理解析

    Spring Boot和Vue跨域請求問題原理解析

    這篇文章主要介紹了Spring Boot和Vue跨域請求問題原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 44條Java代碼優(yōu)化建議

    44條Java代碼優(yōu)化建議

    代碼優(yōu)化的最重要的作用應(yīng)該是:避免未知的錯誤。因此,在寫代碼的時候,從源頭開始注意各種細節(jié),權(quán)衡并使用最優(yōu)的選擇,將會很大程度上避免出現(xiàn)未知的錯誤,從長遠看也極大的降低了工作量
    2018-03-03
  • MyBatis的foreach語句詳解

    MyBatis的foreach語句詳解

    這篇文章主要介紹了MyBatis的foreach語句詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 詳解MyBatis的動態(tài)SQL實現(xiàn)原理

    詳解MyBatis的動態(tài)SQL實現(xiàn)原理

    MyBatis提供了強大的動態(tài)SQL語句生成功能,以應(yīng)對復(fù)雜的業(yè)務(wù)場景,本篇文章將結(jié)合MyBatis解析SQL語句的過程對MyBatis中對<if>,<where>,<foreach>等動態(tài)SQL標(biāo)簽的支持進行分析,需要的朋友可以參考下
    2023-07-07
  • springboot整合mybatis-plus代碼生成器的配置解析

    springboot整合mybatis-plus代碼生成器的配置解析

    這篇文章主要介紹了springboot整合mybatis-plus代碼生成器的配置解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 全面解析Java中的引用類型

    全面解析Java中的引用類型

    在Java中對象以引用來指向JVM的內(nèi)存區(qū)塊,這里我們總結(jié)了強引用、軟引用、弱引用和假象引用(幽靈引用),下面就具體來全面解析Java中的引用類型:
    2016-05-05
  • 深入了解Java?File對象的使用

    深入了解Java?File對象的使用

    這篇文章主要為大家詳細介紹了Java中File對象的使用的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-11-11
  • Java 反射機制的實例詳解

    Java 反射機制的實例詳解

    這篇文章主要介紹了Java 反射機制的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握反射機制,需要的朋友可以參考下
    2017-10-10
  • Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案

    Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案

    這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論