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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構06樹和二叉樹

第六章 樹和二叉樹 6.1 樹的定義和基本術語 樹 Tree 是n個結點的有限集。 任意一棵非空樹中&#xff1a; &#xff08;1&#xff09;有且僅有一個特定的稱為根&#xff08;root&#xff09;的結點&#xff1b; &#xff08;2&#xff09;當n>1時&#xff0c;其余結點可…

2019.03.20 mvt,Django分頁

MVT模式 MVT各部分的功能: M全拼為Model&#xff0c;與MVC中的M功能相同&#xff0c;負責和數據庫交互&#xff0c;進行數據處理。 V全拼為View&#xff0c;與MVC中的C功能相同&#xff0c;接收請求&#xff0c;進行業務處理&#xff0c;返回響應。 T全拼為Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的輔助類來幫助我們進行并發編程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我們就來學習一下這三個輔助類的用法。以下是本文目錄大綱&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

數據結構07排序

第十章內部排序 10.1 概述 排序就是把一組數據按關鍵字的大小有規律地排列。經過排序的數據更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是穩定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不穩定的&#xff0c;如排序后Kj在前。 分類&#xff1a; 內…

數據結構08查找

第九章 查找 另一種在實際應用中大量使用的數據結構--查找表。 所謂查找&#xff0c;即為在一個含有眾多的數據元素的查找表中找出某個“特定的”數據元素。 查找表 search table 是由同一類型的數據元素構成的集合。集合中的數據元素之間存在著完全松散的關系&#xff0c;故…

下載Centos7 64位鏡像

下載Centos7 64位鏡像 1.打開Centos官網 打開Centos官方網站地址&#xff1a;https://www.centos.org/&#xff0c;點擊Get CentOS Now 2.點擊Minimal ISO鏡像 Minimal ISO鏡像&#xff0c;與DVD ISO鏡像的差別有很多&#xff0c;這里只說兩點 1.Minimal ISO類似于Windows的純凈…

[Objective-C語言教程]結構體(17)

Objective-C數組可定義包含多個相同類型的數據項的變量類型&#xff0c;但結構體是Objective-C編程中的另一個用戶定義數據類型&#xff0c;它可組合不同類型的數據項。 結構體用于表示記錄&#xff0c;假設要圖書館中跟蹤書籍信息。可能希望跟蹤每本書的以下屬性 - 標題作者學…

Scala01入門

第1章 可伸展的語言 Scala應用范圍廣&#xff0c;從編寫腳本&#xff0c;到建立大型系統。 運行在標準Java平臺上&#xff0c;與Java庫無縫交互。 更能發揮力量的地方&#xff1a;建立大型系統或可重用控件的架構。 將面向對象和函數式編程加入到靜態類型語言。 在Scala中&a…

架構師之路17年精選80篇

【架構必備】 《互聯網架構如何實現“高并發”》4W 《TCP接入層的負載均衡、高可用、擴展性架構設計》2.2W 《配置中心架構設計演進》1.7W 《跨公網調用的大坑與架構優化》1.4W 《DNS在架構設計中的巧用》1.9W 《消息如何在網絡上安全傳輸》1.2W 《10W定時任務&#xff0c;如何…

iphone手機型號獲取

#import <sys/utsname.h> //手機型號 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java網絡01基本網絡概念

協議 Protocol&#xff1a;明確規則 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;數據如何分包&#xff1b; ... TCP/IP四層模型&#xff1a; 應用層 HTTP SMTP POP IMAP 傳輸層 TCP UDP 網際層 IP 主機網絡層 host to host layer 數模、…

apache的產品分類說明

分類 項目名 說明 開發語言 服務器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服務器C/CTomcatJava的Web服務器JavaJames郵件服務器JavaSpamAssassin反垃圾郵件C/CPerlApache的Perl編程語言支持C/CTclTCL腳本語言C/CDirectory Server超級目錄服務器JavaAxisW…

Java網絡02基本Web概念

URI Uniform Resource Identifier 同一資源標識符 以特定語法標識一個資源的字符串 絕對URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分為&#xff1a; data file本地文件系統 ftp http telnet urn 統一資源名 scheme-specific-part為&am…

解決自建ca認證后瀏覽器警告

前一篇講解了基本的建立證書的過程&#xff0c;但是建立后總是會在瀏覽器那里警告&#xff1a; 此鏈接不是私密鏈接 --谷歌瀏覽器 此證書頒發機構不可信 此證書不是這個網站的 --ie瀏覽器 總之證書是生成成功了&#xff0c;但是其中的內容填寫錯誤了&a…

設計模式學習(三)——單例模式

在Java開發過程中&#xff0c;很多場景下都會碰到或要用到單例模式&#xff0c;在設計模式里也是經常作為指導學習的熱門模式之一&#xff0c;相信每位開發童鞋都用到過。我們總是沿著前輩的足跡去做設定好的思路&#xff0c;往往沒去探究為何這么做&#xff0c;所以這篇文章對…

Java網絡03流

網絡程序所做的很大一部分工作只是輸入和輸出&#xff1a;從一個系統向另一個系統移動數據。 輸出流 Java的基本輸出流類是java.io.OutputStream: public abstract class OutputStream 這個類提供了寫入數據所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序開發的仿微信demo

(本文參考自github/liujians,地址:https://github.com/liujians/weApp) 作者聲明&#xff1a; 基于微信小程序開發的仿微信demo 整合了ionic的樣式庫和weui的樣式庫 使用請查看使用必讀! 更新日志請點擊這里 目前功能 查看消息 網絡請求獲取數據&#xff08;download示例server…

設計模式之六大原則

設計模式之設計原則 這軟件設計過程中&#xff0c;有六大設計原則&#xff1a; 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則由于軟件開發過程中&#xff0c;根據業務不同等因素形成了各種復雜的而不可預料的需求&#xff0c;遵守原則&#xff0c;讓項…

安裝配置tengine

安裝tengine 1、依賴gcc openssl-devel pcre-devel zlib-devel 安裝&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel 2、解壓tengine壓縮包&#xff0c;并進入目錄&#xff1b; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

請訪問 開源中國下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下載源碼&#xff0c;按照如下的運行使用 springboot 改造 jeesite&#xff0c;只保留最簡單的系統配置 。 介紹 1、運行主類&#xff0c;…