1. 程式人生 > >java ScriptEngine 使用 (支援JavaScript指令碼,eval()函式等)

java ScriptEngine 使用 (支援JavaScript指令碼,eval()函式等)

參考連結:http://www.cnblogs.com/zouhao/p/3644788.html

java中的ScriptEngineManager 可以用於解析指令碼和執行指令碼語言。

簡單的執行指令碼樣例:

package com.eastcom.first.spark.data.script;

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

public class ListScriptEngines {

	public static void main(String args[]) throws ScriptException {

		ScriptEngineManager manager = new ScriptEngineManager();

		ScriptEngine engine = manager.getEngineByName("javascript");

		Double hour = (Double) engine.eval("var date = new Date();" + "date.getHours();");

		System.out.println("hour : " + hour);

	}
}

執行結果:

hour : 14.0

和指令碼語言進行互動

  上面例子只是運行了一個非常簡單的指令碼。這個指令碼是孤立的,並未通過Java向這指令碼傳遞任何的值。雖然從這個指令碼返回了一個值,但這種返回方式是隱式的。

  指令碼引擎除了這些簡單的功能,還為我們提供了更強大的功能。甚至可以通過Java向指令碼語言中傳遞引數,還可以將指令碼語言中的變數的值取出來。這些功能要依靠ScriptEngine中的兩個方法put和get。

  put 有兩個引數,一個是指令碼變數名,另一個是變數的值,這個值是Object型別,因此,可以傳遞任何值。

  get 有一個引數,就是指令碼變數的名。

  下面的程式碼通過javascript指令碼將一個字串翻轉(這個字串是通過java傳給javascript的),然後通過java得到這個被翻轉後的字元後,然後輸出。


樣例:

package com.eastcom.first.spark.data.script;

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

public class ReverseString {

	public static void main(String args[]) throws ScriptException {

		ScriptEngineManager manager = new ScriptEngineManager();

		ScriptEngine engine = manager.getEngineByName("javascript");

		engine.put("name", "abcdefg");

		engine.eval("var output ='' ;" + "for (i = 0; i <= name.length; i++) { " + " output = name.charAt(i) + output"
				+ "}");

		String name = (String) engine.get("output");

		System.out.printf("被翻轉後的字串:%s", name);

	}
}

執行結果:

被翻轉後的字串:gfedcba

更多詳解參考上面連結。