日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JDK1.8中如何用ScriptEngine动态执行JS

發布時間:2023/11/30 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK1.8中如何用ScriptEngine动态执行JS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的類,該類對于先前版本的相應類進行了封裝,使得代碼很簡單了。

總結

以上是生活随笔為你收集整理的JDK1.8中如何用ScriptEngine动态执行JS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。