精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Java中使用腳本語言 javax.script探秘

開發 后端
Java 6對腳本語言的支持來自JSR223規范,對應的包是javax.script。今天我們就一起來看看Java混合編程的一個嘗試,在Java中使用腳本語言進行編程。

之前我們提到Java,總說其最大的特點是跨平臺,是一次編寫到處運行。但最近幾年,Java領域最大的變化就是基于JVM的語言正在開始流行,Java已經進入了混合編程時代。今天我們要向您介紹的就是Java在多語言方面的一個嘗試,在Java中使用腳本語言。(關于Java多語言編程請參考51CTO的專題:《Java程序員的未來 走向混合編程時代》)。

1、可用的腳本引擎

Java 6提供對執行腳本語言的支持,這個支持來自于JSR223規范,對應的包是javax.script。默認情況下,Java 6只支持JavaScript腳本,它底層的實現是Mozilla Rhino,它是個純Java的JavaScript實現。可以通過下面的代碼列出當前環境中支持的腳本引擎:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ListScriptEngineFactory> factories = manager.getEngineFactories();  
  3.         for (ScriptEngineFactory f : factories) {  
  4.             System.out.println(  
  5.                     "egine name:"+f.getEngineName()+  
  6.                     ",engine version:"+f.getEngineVersion()+  
  7.                     ",language name:"+f.getLanguageName()+  
  8.                     ",language version:"+f.getLanguageVersion()+  
  9.                     ",names:"+f.getNames()+  
  10.                     ",mime:"+f.getMimeTypes()+  
  11.                     ",extension:"+f.getExtensions());  
  12.         } 

輸出結果:egine name:Mozilla Rhino,engine version:1.6 release 2,language name:ECMAScript,language version:1.6,names:[js, rhino, JavaScript, javascript, ECMAScript, ecmascript],mime:[application/javascript, application/ecmascript, text/javascript, text/ecmascript],extension:[js]。

可以看到,Java內置只支持JavaScript一種腳本。但是,只要遵循 JSR223,便可以擴展支持多種腳本語言,可以從https://scripting.dev.java.net/上查找當前已被支持的腳本的第三方庫。

2、hello script

接下來給出在Java中使用JavaScript的Hello world示例:

  1. ScriptEngineManager manager = new ScriptEngineManager ();  
  2.         ScriptEngine engine = manager.getEngineByName ("js");  
  3.         String script = "print ('hello script')";  
  4.         try {  
  5.             engine.eval (script);  
  6.         } catch (ScriptException e) {  
  7.             e.printStackTrace();  
  8.         } 

使用的API還是很簡單的,ScriptEngineManager是ScriptEngine的工廠,實例化該工廠的時候會加載可用的所有腳本引擎。從工廠中創建ScriptEngine可以使用getEngineByName、getEngineByExtension或 getEngineByMimeType來得到,只要參數名字能對上。執行腳本調用eval方法即可(效果等同于JavaScript中的eval)。

3、傳遞變量

可以向腳本中傳遞變量,使得Java代碼可以和腳本代碼交互,示例如下:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ScriptEngine engine = manager.getEngineByName("js");  
  3.         engine.put("a"4);  
  4.         engine.put("b"6);  
  5.         try {  
  6.             Object maxNum = engine.eval("function max_num(a,b){return (a>b)?a:b;}max_num(a,b);");  
  7.             System.out.println("max_num:" + maxNum);  
  8.         } catch (Exception e) {  
  9.             e.printStackTrace();  
  10.         } 

輸出內容:max_num:6

對于上面put的變量,它作用于自身engine范圍內,也就是ScriptContext.ENGINE_SCOPE,put 的變量放到一個叫Bindings的Map中,可以通過 engine.getBindings(ScriptContext.ENGINE_SCOPE).get(“a”);得到put的內容。和ENGINE_SCOPE相對,還有個ScriptContext.GLOBAL_SCOPE 作用域,其作用的變量是由同一ScriptEngineFactory創建的所有ScriptEngine共享的全局作用域。

4、動態調用

上面的例子中定義了一個JavaScript函數max_num,可以通過Invocable接口來多次調用腳本庫中的函數,Invocable接口是 ScriptEngine可選實現的接口。下面是個使用示例:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ScriptEngine engine = manager.getEngineByName("js");  
  3.         try {  
  4.             engine.eval("function max_num(a,b){return (a>b)?a:b;}");  
  5.             Invocable invoke = (Invocable) engine;  
  6.             Object maxNum = invoke.invokeFunction("max_num",4,6);  
  7.             System.out.println(maxNum);  
  8.             maxNum = invoke.invokeFunction("max_num"7,6);  
  9.             System.out.println(maxNum);  
  10.         } catch (Exception e) {  
  11.             // TODO: handle exception  
  12.         } 

上面的invokeFunction,第一個參數調用的腳本函數名,后面跟的可變參數是對應的腳本函數參數。#p#

Invocable還有個很酷的功能,就是動態實現接口,它可以從腳本引擎中得到Java Interface 的實例;也就是說,可以定義個一個Java接口,其實現是由腳本完成。以上面的例子為例,定義接口JSLib,該接口中的函數和JavaScript中的函數簽名保持一致:

  1. public interface JSLib {  
  2.        public int max_num(int a,int b);  
  3.    } 

 

調用示例:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ScriptEngine engine = manager.getEngineByName("js");  
  3.         try {  
  4.             engine.eval("function max_num(a,b){return (a>b)?a:b;}");  
  5.             Invocable invoke = (Invocable) engine;  
  6.             JSLib jslib = invoke.getInterface(JSLib.class);  
  7.             int maxNum = jslib.max_num(4,6);  
  8.             System.out.println(maxNum);  
  9.         } catch (Exception e) {  
  10.             // TODO: handle exception  
  11.         } 

 

5、使用Java對象

可以在JavaScript中使用Java代碼,這確實是很酷的事情。在Rhino中,可以通過importClass導入一個類,也可以通過importPackage導入一個包,也可以直接使用全路經的類。在創建對象時,new也不是必須的。示例代碼如下:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ScriptEngine engine = manager.getEngineByName("js");  
  3.         try {  
  4.             String script = "var list = java.util.ArrayList();list.add(\"kafka0102\");print(list.get(0));";  
  5.             engine.eval(script);  
  6.         } catch (Exception e) {  
  7.             e.printStackTrace();  
  8.         } 

 

6、編譯執行

腳本引擎默認是解釋執行的,如果需要反復執行腳本,可以使用它的可選接口Compilable來編譯執行腳本,以獲得更好的性能,示例代碼如下:

  1. ScriptEngineManager manager = new ScriptEngineManager();  
  2.         ScriptEngine engine = manager.getEngineByName("js");  
  3.         try {  
  4.             Compilable compEngine = (Compilable) engine;  
  5.             CompiledScript script = compEngine.compile("function max_num(a,b){return (a>b)?a:b;}");  
  6.             script.eval();  
  7.             Invocable invoke = (Invocable) engine;  
  8.             Object maxNum = invoke.invokeFunction("max_num",4,6);  
  9.             System.out.println(maxNum);  
  10.         } catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         } 

 

7、總結

除了上面提到的特性,腳本引擎還有一些不錯的功能,比如可以執行腳本文件,可以由多線程異步執行腳本等功能。引入腳本引擎,可以對一些配置擴展和業務規則做更強大而靈活的支持,也方便使用者選擇自己熟悉的腳本語言來編寫業務規則等。

 

責任編輯:佚名 來源: JavaEye的博客
相關推薦

2011-09-07 09:51:27

Javascript

2011-08-25 09:55:27

2010-02-26 13:03:31

Python腳本語言

2011-08-23 09:44:28

LUA腳本

2011-07-06 16:54:44

ASP

2010-03-17 17:06:10

python腳本語言

2010-07-26 15:32:08

Perl腳本語言

2009-06-10 08:41:15

Linux腳本語言

2011-08-22 18:00:53

Lua語言

2010-02-24 14:04:32

Python腳本語言

2020-10-13 19:04:58

Bash信號捕獲Shell腳本

2010-02-26 09:33:51

Python腳本

2012-07-16 11:23:18

LinuxWindows腳本語言

2011-08-25 10:40:21

Lua游戲

2011-08-22 16:59:28

Lua

2011-08-25 11:02:04

2011-08-16 10:03:45

Groovy編程語言Web

2011-05-25 13:22:05

PHPJSON

2011-08-22 18:08:09

Lua腳本

2010-07-26 15:55:51

Perl腳本語言
點贊
收藏

51CTO技術棧公眾號

亚洲国产123| 国产精品igao网网址不卡| 午夜国产在线观看| 久久久久久网| 日韩视频欧美视频| 一级全黄裸体片| 97成人资源| 中文字幕一区二区三区四区 | 成年人视频免费在线播放| 成人精品鲁一区一区二区| 国产97在线亚洲| 国产精品老熟女一区二区| 欧洲在线一区| 制服丝袜亚洲色图| 国产男女在线观看| 亚洲卡一卡二| 欧美国产亚洲另类动漫| av一区二区三区四区电影| 中文字幕一区二区人妻视频| 91成人精品| 国产一区二区三区高清在线观看| 日本少妇一区二区三区| 在线一区视频观看| 亚洲成在线观看| 欧美h视频在线观看| 四虎精品成人免费网站| 国产精品亚洲一区二区三区在线| 国产精品爱久久久久久久| 日本一区二区免费在线观看| 亚洲国产精品久久久天堂| 亚洲美女视频网| 国产a级片视频| 亚洲综合伊人| 欧美视频在线观看一区二区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 日韩伦理电影网站| 亚洲天天做日日做天天谢日日欢 | 日韩国产欧美一区二区| 日韩精品久久久久久福利| 激情av中文字幕| 精品午夜视频| 91精品欧美综合在线观看最新| 无码人妻丰满熟妇区五十路百度| 538在线精品| 一区二区三区影院| 日韩不卡一二区| 蜜桃视频网站在线观看| 亚洲国产精华液网站w| 欧美日韩最好看的视频| 外国精品视频在线观看| 国产91色综合久久免费分享| 成人在线激情视频| 少妇无套内谢久久久久| 丝袜美腿高跟呻吟高潮一区| 欧美亚洲视频在线看网址| 日韩av电影网址| 伊人激情综合| 性欧美暴力猛交69hd| 国产中文字幕免费| 亚洲高清免费| 欧美一区二区三区艳史| 日韩色图在线观看| 日韩avvvv在线播放| 国产裸体写真av一区二区| 亚洲视频一区二区三区四区| 美女高潮久久久| 成人国产精品一区二区| 国产又粗又大又黄| 国产精品中文字幕欧美| ts人妖另类在线| 神马午夜精品95| 久久综合久久综合久久| 日韩三级电影| 日韩精品毛片| 一区二区在线观看免费| www.国产在线视频| 欧美办公室脚交xxxx| 色综合久久综合网| jizz欧美性11| 一区二区日韩| 日韩av在线一区| 中文字幕av久久爽一区| 亚洲精品网址| 97碰碰碰免费色视频| 天天射天天干天天| 国产一区二区看久久| 国产精品一区二区免费看| 青青草娱乐在线| 国产精品初高中害羞小美女文| 久久久久亚洲av无码专区喷水| 91超碰在线| 欧美天堂亚洲电影院在线播放| а 天堂 在线| 久久午夜影院| www.日韩av.com| 日韩欧美一区二区一幕| 日韩av不卡在线观看| 97碰碰视频| 九色视频成人自拍| 亚洲精品水蜜桃| 日本三区在线观看| 五月亚洲婷婷| 一本色道久久综合亚洲精品小说| 欧美亚洲日本在线| 亚洲专区一区二区三区| 国产一区深夜福利| 日韩欧美在线番号| 一区二区三区小说| 精品999在线| 欧美一区二区三区红桃小说| 日韩亚洲精品电影| 久久精品国产成人av| 国产一区二区精品久久99| 欧美日韩亚洲一区二区三区在线观看 | 男女啪啪999亚洲精品| 亚洲国产精品一区二区三区| 免费精品在线视频| 老司机精品视频网站| 不卡的av一区| 蜜芽在线免费观看| 日本道精品一区二区三区 | 久久综合九色综合97_久久久| 欧美亚洲视频一区| 国产v综合v| 亚洲成成品网站| 紧身裙女教师波多野结衣| 视频一区二区三区入口| 国产欧美综合精品一区二区| 好了av在线| 欧美日韩三级一区二区| 国产精品无码永久免费不卡| 欧美三级第一页| 成人中文字幕在线观看| 成人在线观看网站| 色先锋资源久久综合| av av在线| 欧美日韩一视频区二区| 97人人模人人爽人人喊38tv| 欧美被日视频| 在线电影国产精品| 午夜国产福利视频| 日本不卡一区二区| 四虎永久国产精品| 黄色成人在线视频| 在线日韩精品视频| 91丨九色丨海角社区| 久久久欧美精品sm网站| 欧美三级午夜理伦三级| 欧美男gay| 国产精品va在线| 国产视频精选在线| 欧美无乱码久久久免费午夜一区| 久久精品视频18| 日韩二区在线观看| 午夜午夜精品一区二区三区文| 在线观看精品| 夜夜嗨av一区二区三区免费区 | 69堂成人精品免费视频| 中文字幕乱码av| 国产一区视频导航| 天堂а√在线中文在线| 超碰成人福利| 欧美性视频网站| 国产在线网站| 欧美日韩亚洲综合一区二区三区| 国产精品视频看看| 国产大陆a不卡| 男女视频网站在线观看| 日韩动漫一区| 国产精品日韩精品| 黄色av电影在线观看| 日韩欧美国产成人一区二区| 日韩免费av片| 国产日韩欧美一区二区三区乱码| av污在线观看| 亚洲女同一区| 精品麻豆av| 嫩草伊人久久精品少妇av杨幂| 最近2019免费中文字幕视频三| 国产手机av在线| 精品久久久久久中文字幕| 性欧美13一14内谢| 国内精品在线播放| 国产日韩欧美精品在线观看| 少妇精品久久久一区二区| 91精品国产综合久久香蕉| 青春草免费在线视频| 亚洲精品永久免费精品| 一女二男一黄一片| 天天操天天干天天综合网| 国产激情av在线| 国产91在线观看| 亚洲激情在线观看视频| 国产精品hd| 深夜福利成人| 成人资源在线| 国产精品欧美激情在线播放| 肉肉视频在线观看| 国产亚洲视频中文字幕视频| www.五月婷婷| 欧美影院精品一区| 精品一级少妇久久久久久久| 欧美国产日韩a欧美在线观看| 免费黄视频在线观看| 青青青伊人色综合久久| 精品成在人线av无码免费看| 日韩欧美午夜| 六月婷婷久久| 综合视频一区| 成人信息集中地欧美| 户外露出一区二区三区| 午夜精品美女自拍福到在线| 免费观看在线午夜影视| 亚洲欧洲黄色网| 欧美一区二区三区激情| 91精品久久久久久久91蜜桃| 一二三区免费视频| 欧美日韩色婷婷| 麻豆视频在线观看| 亚洲欧洲中文日韩久久av乱码| 免费观看av网站| 成人性生交大片免费看视频在线 | caoporn国产| 亚洲午夜久久久久中文字幕久| 亚洲欧美综合7777色婷婷| 2024国产精品视频| 无码国产69精品久久久久网站| 狠狠狠色丁香婷婷综合久久五月| 欧美日韩在线免费播放| 一区二区三区四区五区在线| a级黄色片免费| **女人18毛片一区二区| 亚洲精品在线免费看| 精品日韩一区| 日本一区二区三区www| 日韩影视高清在线观看| 国产三级精品在线不卡| 亚洲综合网狠久久| 动漫一区二区在线| 日韩三级久久| av一区和二区| 97品白浆高清久久久久久| 亚洲一区中文字幕| 日韩视频一区二区三区四区| 成人国产精品久久久| 日韩五码电影| 91久久国产精品| 久久精品一级| 99视频日韩| 国产精品久av福利在线观看| 国产专区一区二区| 国产香蕉精品| 精品视频第一区| 天堂99x99es久久精品免费| 久久久亚洲综合网站| 亚洲人成网www| 欧美在线一区二区三区四区| 男男gay无套免费视频欧美| 日韩高清国产精品| 四虎成人精品永久免费av九九| 亚洲欧洲久久| 亚洲综合小说| 男人插女人视频在线观看| 日韩午夜电影| 日本爱爱免费视频| 经典一区二区三区| 国产精品19p| 99国内精品久久| 亚洲精品国产一区黑色丝袜| 国产精品久久久久9999吃药| caoporn91| 午夜一区二区三区在线观看| 五月婷婷视频在线| 欧美日韩在线不卡| 国内精品久久久久久久久久久| 精品国产凹凸成av人网站| 日本在线一二三| 中文字幕日韩欧美| 污的网站在线观看| 26uuu另类亚洲欧美日本一| 亚洲精品555| 国产不卡一区二区在线观看| 九一成人免费视频| 97精品国产97久久久久久粉红| 日韩香蕉视频| 成人性生交免费看| 成人国产电影网| 亚洲av无码国产精品麻豆天美| 中文字幕亚洲欧美在线不卡| 久久9999久久免费精品国产| 日本黄色一区二区| www.香蕉视频| 国产午夜精品一区二区三区| 69xxx在线| 国产精品91免费在线| 亚洲超碰在线观看| 日韩福利在线| 日韩午夜av| 乳色吐息在线观看| 欧美激情综合在线| 国产午夜小视频| 欧美浪妇xxxx高跟鞋交| 亚州男人的天堂| 欧美另类高清videos| 78精品国产综合久久香蕉| 国产精品综合久久久久久| 一本色道久久88亚洲精品综合| 欧美日韩国产综合网| 不卡av免费在线| 成人97人人超碰人人99| 美国黄色片视频| 日本精品一区二区三区四区的功能| 性做久久久久久久久久| 日韩在线播放av| 国模套图日韩精品一区二区| av色综合网| 99久久精品费精品国产| 国产xxxxx视频| 91视频.com| 国产一级一级片| 69堂亚洲精品首页| 日韩子在线观看| 国产精品入口免费视| 伊人久久大香线蕉综合网站| 热99这里只有精品| 国产成人免费视频| 中文字幕无码日韩专区免费| 欧洲视频一区二区| 你懂的在线观看视频网站| 97人洗澡人人免费公开视频碰碰碰| 精品一区二区三区中文字幕视频| 四虎永久国产精品| 蜜桃精品视频在线观看| 公肉吊粗大爽色翁浪妇视频| 黑丝美女久久久| 亚州视频一区二区三区| 69视频在线播放| 色婷婷久久久| 国产免费黄视频| 26uuu精品一区二区在线观看| 免费观看一级视频| 日韩av影视综合网| 国产社区精品视频| 九九九热999| 久久国产精品99国产| 亚洲AV无码片久久精品| 欧美性猛交xxxx黑人| 日本aaa在线观看| 日产精品99久久久久久| 久久av综合| 性欧美极品xxxx欧美一区二区| 国产亚洲精品资源在线26u| 亚洲国产成人精品女人久久| 永久免费看mv网站入口亚洲| 成人四虎影院| youjizz.com亚洲| 国产91富婆露脸刺激对白| 国产在线观看你懂的| 亚洲精品国产欧美| 久久野战av| 日日噜噜噜夜夜爽爽| 成人一道本在线| 日本一级片免费看| 亚洲视频999| 五月天色综合| www.男人天堂网| 91麻豆swag| 中文字幕 亚洲视频| 美日韩精品免费观看视频| 99精品国产高清一区二区麻豆| 777久久久精品一区二区三区| 国产日本欧美一区二区| 一区二区三区免费在线| 欧美日韩国产123| 亚洲尤物av| 亚洲第一成肉网| 精品久久久久久久久久久| 岛国在线大片| av在线亚洲男人的天堂| 久久国产精品亚洲77777| 国产又粗又长又黄的视频| 精品欧美久久久| 免费日韩电影| 法国空姐在线观看免费| 久久在线免费观看| 国产毛片一区二区三区va在线| 久久免费视频观看| 日韩国产一区二区| 久久性爱视频网站| 欧美日韩日日骚| 九色porny丨入口在线| 伊人久久大香线蕉成人综合网 | 精品国产成人在线| 在线看的av网站| 精品一区二区三区国产| 精品一区二区三区免费播放| 在线观看免费国产视频| 日韩在线播放av| 国产欧美日韩在线观看视频| 男男受被啪到高潮自述|