1. 程式人生 > 其它 >JAVA指令碼引擎01-執行JavaScript

JAVA指令碼引擎01-執行JavaScript

技術標籤:Java指令碼引擎指令碼語言

支援版本: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();

結果輸出