【Java腳本引擎】腳本引擎執行JavaScript代碼

應用場景

公司有30員工,每個人工資計算方式不同。現在需要計算工資。

傳統的方法:一個接口,30個實現類。

使用腳本引擎:編寫一個xml文件,每人一個計算公式,使用的時候可以把公式加載到程序中,啓動時使用腳本引擎調用相關的腳本,計算工資。
在這裏插入圖片描述
通過腳本引擎管理器,獲得腳本引擎對象,執行相關代碼
在這裏插入圖片描述在這裏插入圖片描述

Warning: Nashorn engine is planned to be removed from a future JDK release

警告:計劃從未來的JDK版本中刪除Nashorn引擎


示例(1):在Java中執行JS代碼

package cn.hanquan.rhino;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

//測試腳本引擎執行JavaScript代碼
public class TestRhino {
	public static void main(String[] args) throws Exception {
		// 獲得腳本引擎對象
		ScriptEngineManager sem = new ScriptEngineManager();
		ScriptEngine engine = sem.getEngineByName("javascript");

		// 定義變量,存儲到引擎的上下文中
		engine.put("msg", "hello~world!");
		String str = "var user= {name:'HanQuan', age:29};";
		str += "print(user.name);";

		// 執行腳本
		engine.eval(str);
	}
}

運行結果

HanQuan

示例(2):分別通過 JavaScript/Java 獲取腳本引擎定義的msg變量、使用腳本引擎修改msg的內容

  • 引擎,相當於連接JavaScript和Java的橋樑。
  • 存儲到引擎的上下文中的變量msg,既可以被JavaScript操作,也可以被Java操作
package cn.hanquan.rhino;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

//測試腳本引擎執行JavaScript代碼
public class Demo1 {
	public static void main(String[] args) throws Exception {
		// 獲得腳本引擎對象
		ScriptEngineManager sem = new ScriptEngineManager();
		ScriptEngine engine = sem.getEngineByName("javascript");

		// 定義變量msg,存儲到引擎的上下文中
		engine.put("msg", "hello~world!");

		// 使用js修改msg內容
		engine.eval("msg='Hello,Are you Okayyyy'");

		// 分別通過 JavaScript/Java 獲取msg
		engine.eval("print('通過JavaScript獲取msg: '+msg);");
		System.out.println("通過Java獲取msg:" + engine.get("msg"));
	}
}

運行結果

通過JavaScript獲取msg: Hello,Are you Okayyyy
通過Java獲取msg:Hello,Are you Okayyyy

示例(3):分別用JavaScript和Java,執行JavaScipt中的函數

package cn.hanquan.rhino;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

//測試腳本引擎執行JavaScript代碼
public class Demo2 {
	public static void main(String[] args) throws Exception {
		// 獲得腳本引擎對象
		ScriptEngineManager sem = new ScriptEngineManager();
		ScriptEngine engine = sem.getEngineByName("javascript");

		// 定義函數
		engine.eval("function add(a,b){var sum=a+b; return sum;}");

		// 通過JavaScript執行函數
		engine.eval("print('通過JavaScript執行函數: ' + add(11,22));");

		// 通過Java執行函數
		Invocable jsInvoke = (Invocable) engine;
		Object res = jsInvoke.invokeFunction("add", new Object[] { 44, 55 });
		System.out.println("通過Java執行函數: " + res);
	}
}

運行結果

通過JavaScript執行函數: 33
通過Java執行函數: 99.0

還可以導入其他Java包
在這裏插入圖片描述運行結果

北京尚學堂
清華大學
北京大學

* 若想要深入瞭解 Rhino 細節,可以上 Rhino 官網,詳細學習 Rhino 語法。
* 另外,還有很多用 Java 執行 JS 腳本的方法, Rhino 只是其中一種。


執行本地的JavaScript文件

JS代碼
在這裏插入圖片描述
目錄結構
在這裏插入圖片描述
Java代碼在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章