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(); } }