JDK1.8中如何用ScriptEngine動態執行JS
jdk1.6開始就提供了動態腳本語言諸如JavaScript動態的支持。這無疑是一個很好的功能,畢竟Java的語法不是適合成為動態語言。而JDK通過執行JavaScript腳本可以彌補這一不足。這也符合“Java虛擬機不僅僅是Java一種語言的虛擬機“這一目標。
ScriptEngine功能強大,基本能實現筆者所能想到的Java與JavaScript交互的需求。而且十分的方便簡潔。jdk1.8又對ScriptEngine接口進行了一定改變,因此,在jdk1.8能運行的代碼,在1.6中可能會報錯,反之亦然。
下面通過具體的代碼講解:
import java.util.Map;
import java.util.TreeMap;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;import jdk.nashorn.api.scripting.ScriptObjectMirror;public class JSEngine {public static ScriptEngine engine;private static String str;//該函數測試Java獲取JS變量值的能力public static void getJsValue() throws Exception{str = " var msg='hello'; "+ " var number = 123; "+ " var array=['A','B','C']; "+ " var json={ "+ " 'name':'pd', "+ " 'subjson':{ "+ " 'subname':'spd' "+ " ,'id':123 "+ " } "+ " }; ";//執行語句engine.eval(str);str="msg+=' world';number+=5";//再次執行engine.eval(str);//獲取js變量msg(String類型)System.out.println(engine.get("msg"));//獲取js變量msg(int類型)System.out.println(engine.get("number"));//獲取js變量array(數組)ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");//getSlot(int index)函數用于獲取下標為index的值System.out.println(array.getSlot(0));//獲取js變量json(json類型)ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");//get(String key)函數用于鍵key的值System.out.println(json.get("name"));//獲取js變量subjson(嵌套json類型)ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");System.out.println(subjson.get("subname"));}//該函數測試Java與js對象public static void getObject() throws Exception{str = " var obj=new Object(); "+ " obj.info='hello world'; "+ " obj.getInfo=function(){ "+ " return this.info; "+ " }; ";engine.eval(str);//獲取對象ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");//輸出屬性System.out.println(obj.get("info"));System.out.println(obj.get("getInfo"));str="obj.getInfo()";//執行方法System.out.println(engine.eval(str));}//java將變量導入js腳本public static void putValue() throws Exception{str="Math.pow(a,b)";Map<String, Object>input=new TreeMap<>();input.put("a",2);input.put("b",8);System.out.println(engine.eval(str,new SimpleBindings(input)));}//調用js函數public static void callJsFunction() throws Exception{engine.eval("function add (a, b) {return a+b; }");Invocable jsInvoke = (Invocable) engine;Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });System.out.println(res);}public static void main(String[] args) throws Exception {//獲取js引擎實例ScriptEngineManager sem = new ScriptEngineManager();engine=sem.getEngineByName("javascript");getJsValue();getObject();putValue();callJsFunction();}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
是不是很有趣呢,注意的是ScriptObjectMirror類上市jdk1.8的類,該類對于先前版本的相應類進行了封裝,使得代碼很簡單了。