Java呼叫JavaScript指令碼的例子
阿新 • • 發佈:2018-11-15
Java中提供了一個指令碼引擎管理器:ScriptEngineManager,它會在虛擬機器啟動時發現可用的指令碼引擎。
指令碼引擎管理器
構造一個 ScriptEngineManager,呼叫它的 getEngineFactories 方法,可用獲取到當前Java環境所有支援的引擎工廠,可用通過迴圈去獲取每個引擎工廠的屬性。請參考以下程式碼:
public static void main(String[] args) { // 構造一個指令碼引擎管理器 ScriptEngineManager manager = new ScriptEngineManager(); // 遍歷所有的引擎工廠,輸出引擎工廠的資訊 for (ScriptEngineFactory factory : manager.getEngineFactories()) { String engineName = factory.getEngineName(); String engineVersion = factory.getEngineVersion(); String languageName = factory.getLanguageName(); String languageVersion = factory.getLanguageVersion(); ScriptEngine engine = factory.getScriptEngine(); System.out.println(String.format("引擎名稱:%s\t引擎版本:%s\t語言名稱:%s\t語言版本:%s\t", engineName, engineVersion, languageName, languageVersion)); } }
以上程式可能會輸出以下結果:
引擎名稱:Oracle Nashorn 引擎版本:1.8.0_152 語言名稱:ECMAScript 語言版本:ECMA - 262 Edition 5.1
Java呼叫JavaScript指令碼
首先通過構造指令碼引擎管理器 ScriptEngineManager,得到所有支援的引擎工廠,並判斷是否支援JS引擎,如果支援,才可以執行JS指令碼。
請參考以下完整程式碼:
package me.zebe.cat; import javax.script.*; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; /** * 呼叫JavaScript指令碼演示 * @author Zebe */ public class CallJavaScriptDemo { /** * 執行入口 * @param args 執行引數 */ public static void main(String[] args) { // 構造一個指令碼引擎管理器 ScriptEngineManager manager = new ScriptEngineManager(); // 遍歷所有的引擎工廠,輸出引擎工廠的資訊 for (ScriptEngineFactory factory : manager.getEngineFactories()) { String engineName = factory.getEngineName(); String engineVersion = factory.getEngineVersion(); String languageName = factory.getLanguageName(); String languageVersion = factory.getLanguageVersion(); ScriptEngine engine = factory.getScriptEngine(); System.out.println(String.format("引擎名稱:%s\t引擎版本:%s\t語言名稱:%s\t語言版本:%s\t", engineName, engineVersion, languageName, languageVersion)); // 如果支援JavaScript if ("ECMAScript".equals(languageName)) { callSimpleJavaScript(engine); callJavaScriptFromFile(engine); } } } /** * 從簡單字串執行JavaScript指令碼 * @param engine 指令碼引擎 */ private static void callSimpleJavaScript(ScriptEngine engine) { try { final String script1 = "var k = 0;"; final String script2 = "k + 5;"; System.out.println(script1 + " 的執行結果是:" + engine.eval(script1)); System.out.println(script2 + " 的執行結果是:" + engine.eval(script2)); } catch (ScriptException e) { e.printStackTrace(); } } /** * 從JavaScript檔案執行JavaScript指令碼 * @param engine 指令碼引擎 */ private static void callJavaScriptFromFile(ScriptEngine engine) { try { final String fileName = "test.js"; File file = new File(fileName); if (file.exists()) { System.out.println("從 " + fileName + " 的執行結果是:" + engine.eval(new FileReader(file))); } else { System.err.println(fileName + " 不存在,無法執行指令碼"); } } catch (ScriptException | FileNotFoundException e) { e.printStackTrace(); } } }
小結
指令碼引擎是一個可以執行用某種特定語言編寫的指令碼的類庫。Java不僅可以支援對 JavaScript 的呼叫,還支援對其他型別的指令碼呼叫,包括 Groovy、Ruby,甚至是更加奇異的諸如 Scheme 和 Haskell 等語言編寫的指令碼。本文僅作簡單演示,內容中沒有演示 Java 對 JavaScript 函式的呼叫,請讀者自行研究學習。
本文原文地址:https://blog.csdn.net/zebe1989/article/details/82692160