JAVA指令碼引擎01-執行JavaScript
阿新 • • 發佈:2021-01-07
支援版本:JAVA指令碼引擎是從JDK1.6之後新增的新功能
官網:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino
指令碼引擎介紹:
-
Java應用程式通過一套固定的介面與各種指令碼引擎互動,從而達到在Java平臺上呼叫各種指令碼語言的目的
-
Java指令碼API是連線Java平臺和指令碼語言之間的橋樑
-
把一些複雜易變的業務邏輯交給指令碼語言處理,這就提高了開發效率
Java指令碼API為開發者提供瞭如下功能:
- 獲取指令碼程式輸入,通過指令碼引擎執行指令碼並返回執行結果,這是最核心的介面(注意是“介面”,Java可以使用各種不同的實現,從而通用的呼叫js、groovy、phthon等指令碼)
js使用了Rhino實現(是一種使用Java語言編寫的JavaScript的開源實現,原先由Mozilla開發,現被集成了jdk6.0)
- 指令碼引擎執行上下文和Java平臺間資料交換
- 通過Java應用程式呼叫指令碼函式
Java Code:
package com.project; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /** * 測試指令碼引擎執行JavaScript程式碼 */ public class TestOne { public static void main(String[] args) throws ScriptException, NoSuchMethodException, IOException { //獲得指令碼引擎物件 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engin = sem.getEngineByName("javascript"); //定義變數,put儲存到引擎上下文 engin.put("msg", "hello world"); String str = "var user = {name:'張三',age:15};"; str += "print(user.name)"; //eval執行指令碼 engin.eval("print(msg)"); engin.eval(str); //修改msg測試上下文 engin.eval("msg = 'hello monkey';"); System.out.println(engin.get("msg")); System.out.println("****************************************"); //定義函式 engin.eval("function add(x,y){var sum = x + y;return sum; }"); //執行js函式,取得呼叫介面 Invocable jsInvocable = (Invocable) engin; //執行指令碼中定義的方法 Object result = jsInvocable.invokeFunction("add", new Object[] {10,20}); System.out.println(result); //匯入Java包,使用包中的Java類,需要了解細節,需深入學習Rhino語法 //java6.0寫法 //String jsCode = "importPackage(java.util); var list = Arrays.asList(['a','b']);"; //java8.0寫法 String jsCode = "var list = java.util.Arrays.asList(['a','b']);"; engin.eval(jsCode); List<String> list = (List<String>) engin.get("list"); for(String temp : list) { System.out.println(temp); } System.out.println("****************************************"); //載入js檔案,執行js程式碼(test.js在根目錄src下) URL url = TestOne.class.getClassLoader().getResource("test.js"); FileReader fr = new FileReader(url.getPath()); engin.eval(fr); fr.close(); } }
JS Code
/**
* 定義js方法
*/
function add(){
var x = 5;
var y = 9;
print("sum:"+ (x+y));
}
//執行test方法
add();
結果輸出