Java腳本引擎的使用-創(chuàng)新互聯(lián)

文章目錄
  • 1. 前言
  • 2. 腳本引擎的使用
    • 2.1 腳本參數(shù)傳遞
    • 2.2 腳本編譯
    • 2.3 腳本動態(tài)調用

創(chuàng)新互聯(lián)服務項目包括潁上網站建設、潁上網站制作、潁上網頁制作以及潁上網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,潁上網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到潁上省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!1. 前言

Java 6 版本就已經引入了 Rhino 引擎用以支持腳本代碼運行,而從 Java 8 開始 Nashorn 取代 Rhino 成為 Java 內嵌的 JavaScript 引擎。Nashorn 引擎允許開發(fā)人員將 JavaScript 代碼嵌入到 Java 中執(zhí)行,這個特性在復雜的配置系統(tǒng)中有比較大的應用價值,可以滿足特定場景下的靈活性要求

以下示例代碼可以列出所有腳本引擎工廠的相關屬性,可以看到其支持的腳本引擎包括了 JavaScript 等

public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();
        manager.getEngineFactories().forEach(factory ->System.out.printf("Name: %s%n" +
                        "Version: %s%n" +
                        "Language name: %s%n" +
                        "Language version: %s%n" +
                        "Extensions: %s%n" +
                        "Mime types: %s%n" +
                        "Names: %s%n",
                factory.getEngineName(),
                factory.getEngineVersion(),
                factory.getLanguageName(),
                factory.getLanguageVersion(),
                factory.getExtensions(),
                factory.getMimeTypes(),
                factory.getNames()));
    }

在這里插入圖片描述

2. 腳本引擎的使用

Java 腳本引擎 API 中最主要的是ScriptEngineManager,開發(fā)者可以通過這個類獲取當前 Java 版本所支持的所有腳本引擎,具體獲取腳本引擎的方法有以下3種:

  1. 根據(jù)擴展名得到腳本引擎
    ScriptEngineManager manager = new ScriptEngineManager();
     // getEngineByExtension 的參數(shù)就是 Extensions:[js]中任一個
     ScriptEngine engine = manager.getEngineByExtension("js");
  2. 根據(jù)Mime類型得到腳本引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    // getEngineByMimeType 的參數(shù)可以是 Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]中的任一個
    ScriptEngine engine = manager.getEngineByMimeType("text/javascript");
  3. 根據(jù)名稱得到腳本引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    // getEngineByName 的參數(shù)可以是 Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript] 
    // 中的任一個
    ScriptEngine engine = manager.getEngineByName("javascript");
2.1 腳本參數(shù)傳遞

腳本引擎除了簡單的執(zhí)行功能,還可以通過它向腳本中傳遞參數(shù),同時也可以將腳本中的變量值取出來。這些功能要依靠ScriptEngine#put()ScriptEngine#get()方法,以下為代碼示例

public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();
        // 獲取javascript腳本引擎
        ScriptEngine engine = manager.getEngineByName("js");
        try {// 參數(shù)出入
            engine.put("name", "lucky");
            // 開始執(zhí)行腳本
            engine.eval("var output ='' ;" +
                    "for (i = 0; i<= name.length; i++) {" +
                    "    output = name.charAt(i) + output" +
                    "}");
            // 得到output變量的值
            String name = (String) engine.get("output");
            System.out.printf("被翻轉后的字符串:%s", name);
        } catch (Exception e) {System.err.println(e);
        }
    }
2.2 腳本編譯

如我們所知,腳本解釋執(zhí)行的運行方式性能很低,但是不少腳本語言都支持編譯功能,因此 Java 的腳本引擎也對編譯進行了支持。如果某段腳本要運行多次的話,可以使用編譯的方式將其轉化為執(zhí)行效率更高的形式,從而提高性能

具體做法是調用ScriptEngine#compile()方法進行腳本編譯,不過只有實現(xiàn)了Compilable接口的腳本引擎才可以進行編譯,可參考以下示例

public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();
        // 得到javascript腳本引擎
        ScriptEngine engine = manager.getEngineByName("js");
        try {// 可編譯的腳本,提高執(zhí)行速度
            engine.put("counter", 0);
            // 判斷這個腳本引擎是否支持編譯功能
            if (engine instanceof Compilable) {Compilable compEngine = (Compilable) engine;
                CompiledScript script = compEngine.compile("function count() { " +
                        "    counter = counter +1; " +
                        "    return counter; " +
                        "};" +
                        "count();");
                System.out.printf("Counter: %s%n", script.eval());
                System.out.printf("Counter: %s%n", script.eval());
                System.out.printf("Counter: %s%n", script.eval());
            }
        } catch (Exception e) {System.err.println(e);
        }
    }

在這里插入圖片描述

2.3 腳本動態(tài)調用

業(yè)務系統(tǒng)運行時通常需要將用戶的輸入作為入參執(zhí)行函數(shù),這就產生了腳本方法動態(tài)調用的需求。和編譯一樣,腳本引擎必須實現(xiàn)Invocable接口才可以動態(tài)調用腳本中的方法,具體可參考以下示例

public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {// 動態(tài)決定腳本調用
            String name = "nathan";
            if (engine instanceof Invocable) {engine.eval("function reverse(name) {" +
                        " var output =' ';" +
                        " for (i = 0; i<= name.length; i++) {" +
                        "     output = name.charAt(i) + output" +
                        " }" +
                        " return output;" +
                        "}");
                Invocable invokeEngine = (Invocable) engine;
                Object o = invokeEngine.invokeFunction("reverse", name);
                System.out.printf("翻轉后的字符串:%s", o);
            }
        } catch (Exception e) {System.err.println(e);
        }
    }

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

分享標題:Java腳本引擎的使用-創(chuàng)新互聯(lián)
轉載來于:http://muchs.cn/article10/ceejdo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、企業(yè)建站、服務器托管響應式網站、網站制作、外貿網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設