日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java使用ScriptEngine動(dòng)態(tài)執(zhí)行代碼(附Java幾種動(dòng)態(tài)執(zhí)行代碼比較)

瀏覽:20日期:2022-08-14 14:02:14
引言

在Java項(xiàng)目中,或多或少我們有動(dòng)態(tài)執(zhí)行代碼的需求,比如:

系統(tǒng)中有一個(gè)規(guī)則驗(yàn)證需求,但規(guī)則經(jīng)常改變 代碼熱更新,熱修復(fù)

筆者也在目前參與的一個(gè)項(xiàng)目中遇到了動(dòng)態(tài)執(zhí)行代碼的需求:項(xiàng)目需要一個(gè)自動(dòng)審核模塊,但是審核規(guī)則根據(jù)相關(guān)書(shū)面文件制定,如果寫(xiě)死在.java文件里,那么當(dāng)新的書(shū)面文件下發(fā)時(shí),就要系統(tǒng)停機(jī)更新系統(tǒng),然后才能繼續(xù)使用,其中存在著很多不穩(wěn)定因素,也很麻煩。因此在設(shè)計(jì)上就有動(dòng)態(tài)執(zhí)行代碼的需求。好在這個(gè)需求只是審核一個(gè)表單,并沒(méi)有對(duì)系統(tǒng)的操作和IO操作,輸入?yún)?shù)也很固定。

筆者上網(wǎng)查閱了大量資料,發(fā)現(xiàn)網(wǎng)上大致流傳三種動(dòng)態(tài)執(zhí)行代碼方式,筆者經(jīng)過(guò)全面比較,選擇了其中一種。這里將幾種方法列舉如下。

方法

1.使用JEXL動(dòng)態(tài)執(zhí)行表達(dá)式

參考利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯

JEXL支持兩種循環(huán)方式:

for(item : list) { x = x + item;}

while (x lt 10) { x = x + 2;}

優(yōu)點(diǎn):可以動(dòng)態(tài)執(zhí)行Java代碼,調(diào)用Java Function(Function需先傳入JexlContext)缺點(diǎn):只能執(zhí)行一個(gè)“表達(dá)式”,而不是Function,所以有很多語(yǔ)法局限,不是真正執(zhí)行一個(gè)Function

2.使用Java動(dòng)態(tài)編譯

參考改善Java代碼慎用動(dòng)態(tài)編譯

動(dòng)態(tài)編譯一直是Java的夢(mèng)想,從Java 6版本它開(kāi)始支持動(dòng)態(tài)編譯了,可以在運(yùn)行期直接編譯.java文件,執(zhí)行.class,并且能夠獲得相關(guān)的輸入輸出,甚至還能監(jiān)聽(tīng)相關(guān)的事件。不過(guò),我們最期望的還是給定一段代碼,直接編譯,然后運(yùn)行,也就是空中編譯執(zhí)行(on-the-fly)。

優(yōu)點(diǎn):功能強(qiáng)大,能夠真正實(shí)現(xiàn)完整的動(dòng)態(tài)執(zhí)行功能,能夠動(dòng)態(tài)調(diào)用全部系統(tǒng)功能和IO操作。缺點(diǎn):雖然功能強(qiáng)大,可以編譯.java文件,但是還是很難在運(yùn)行時(shí)替換框架級(jí)的類(lèi)文件,但是相比于上述方法已經(jīng)有過(guò)之而無(wú)不及了;能動(dòng)態(tài)調(diào)用全部系統(tǒng)功能和IO操作,與一般代碼環(huán)境沒(méi)有隔離,從而會(huì)成為項(xiàng)目中一個(gè)非常嚴(yán)重的安全隱患處。

3.使用Java ScriptEngine

使用Java自帶的ScriptEngine可以說(shuō)是最完美的Java動(dòng)態(tài)執(zhí)行代碼方案之一(不考慮代碼熱更新等場(chǎng)景),關(guān)于ScriptEngine網(wǎng)上有大量資料可供參考,這里就不附參考資料了,簡(jiǎn)單提供下一個(gè)使用JS Engine的例子:

String regular='function regular(args1,args2,args3){................}';ScriptEngine engine = new ScriptEngineManager().getEngineByName('javascript');try {engine.eval(regular);if (engine instanceof Invocable) {Invocable invoke = (Invocable) engine;String result = (String) invoke.invokeFunction('regular', args1,args2,args3);System.out.println(result);} else {System.out.println('error');}}} catch (ScriptException e) {System.out.println('表達(dá)式runtime錯(cuò)誤:' + e.getMessage());}

使用eval(),動(dòng)態(tài)執(zhí)行一遍JS代碼(包含一個(gè)JS function),然后利用Java的Invoke傳入?yún)?shù),最后獲取返回值。

優(yōu)點(diǎn):可以執(zhí)行完整的JS方法,并且獲取返回值;在虛擬的Context中執(zhí)行,無(wú)法調(diào)用系統(tǒng)操作和IO操作,非常安全;可以有多種優(yōu)化方式,可以預(yù)編譯,編譯后可以復(fù)用,效率接近原生Java;所有實(shí)現(xiàn)ScriptEngine接口的語(yǔ)言都可以使用,并不僅限于JS,如Groovy,Ruby等語(yǔ)言都可以動(dòng)態(tài)執(zhí)行。

缺點(diǎn):無(wú)法調(diào)用系統(tǒng)和IO操作 ,也不能使用相關(guān)js庫(kù),只能使用js的標(biāo)準(zhǔn)語(yǔ)法。更新:可以使用scriptengine.put()將Java原生Object傳入Context,從而拓展實(shí)現(xiàn)調(diào)用系統(tǒng)和IO等操作。

對(duì)于一般的動(dòng)態(tài)執(zhí)行代碼需求,建議使用最后一種方法。

JDK8中Java調(diào)用Javascript腳本引擎動(dòng)態(tài)定義與執(zhí)行代碼

import java.lang.*;import java.util.Arrays;import java.util.List; import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager; public class ScriptEngineTest { public static void main(String[] args) throws Exception { ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName('javascript'); //python or jython, <pre name='code' class='html'> //向上下文中存入變量 engine.put('msg', 'just a test'); //定義類(lèi)user String str = 'msg += ’!!!’;var user = {name:’tom’,age:23,hobbies:[’football’,’basketball’]}; '; engine.eval(str); //從上下文引擎中取值 String msg = (String) engine.get('msg'); String name = (String) engine.get('name'); String[] hb = engine.get('hb'); System.out.println(msg); System.out.println(name + ':' + hb[0]); //定義數(shù)學(xué)函數(shù) engine.eval('function add (a, b) {c = a + b; return c; }'); //取得調(diào)用接口 Invocable jsInvoke = (Invocable) engine; //定義加法函數(shù) Object result1 = jsInvoke.invokeFunction('add', new Object[] { 10, 5 }); System.out.println(result1); //調(diào)用加法函數(shù),注意參數(shù)傳遞的方法 Adder adder = jsInvoke.getInterface(Adder.class); int result2 = adder.add(10, 35); System.out.println(result2); //定義run()函數(shù) engine.eval('function run() {print(’www.java2s.com’);}'); Invocable invokeEngine = (Invocable) engine; Runnable runner = invokeEngine.getInterface(Runnable.class); //定義線程運(yùn)行之 Thread t = new Thread(runner); t.start(); t.join(); //導(dǎo)入其他java包 String jsCode = 'importPackage(java.util); var list2 = Arrays.asList([’A’, ’B’, ’C’]); '; engine.eval(jsCode); List<String> list2 = (List<String>) engine.get('list2'); for (String val : list2) { System.out.println(val);} } }

腳本引擎為實(shí)現(xiàn)動(dòng)態(tài)功能(如插件機(jī)制)提供了良好的擴(kuò)展性.

有關(guān)引擎接口的文檔:

ScriptEngine

到此這篇關(guān)于Java使用ScriptEngine動(dòng)態(tài)執(zhí)行代碼(附Java幾種動(dòng)態(tài)執(zhí)行代碼比較)的文章就介紹到這了,更多相關(guān)Java ScriptEngine動(dòng)態(tài)執(zhí)行內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精精国产xxxx视频在线播放| 欧美专区一区二区三区| 免费日本视频一区| 在线观看免费一区二区| 亚洲黄色免费看| 亚洲深夜视频| 日韩精品诱惑一区?区三区| 91日韩欧美| 综合日韩av| 最新中文字幕在线播放| 夜鲁夜鲁夜鲁视频在线播放| 国产v日韩v欧美v| 人人草在线视频| 桃色一区二区| 欧美91精品| 亚洲欧美日韩国产一区| 99热精品在线观看| 免费黄网站欧美| 18国产精品| 中文字幕一区二区三区四区久久| 久久久久91| 91精品一区国产高清在线gif| 久久精品123| 一区免费在线| 日本一区二区三区视频在线看| 亚洲精品影视| 国产精品亚洲欧美| 精品视频91| 色老板在线视频一区二区| 偷拍欧美精品| 蜜桃av一区二区在线观看| 国产精品嫩草99av在线| 日韩在线黄色| 卡一卡二国产精品| 亚洲大片在线| 亚洲精品伊人| 精品一区视频| 蜜桃国内精品久久久久软件9| 先锋影音国产一区| 国产精品欧美三级在线观看| 欧美黄色网页| 亚洲精品乱码| 麻豆精品蜜桃视频网站| 日韩精品dvd| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品久久| 久久久久.com| 日本中文字幕一区二区| 成人午夜毛片| 日韩专区一卡二卡| 久久精品国产亚洲一区二区三区| 久久久久久久久99精品大| 中文字幕日本一区| 国产精品久久久久久久免费观看| 亚洲精品一区二区在线看| 福利片在线一区二区| 蘑菇福利视频一区播放| 精品国产一区二| 国产亚洲在线| 国产极品一区| 国产精品日本欧美一区二区三区| 国产调教精品| 欧美二区视频| 欧美黄色一区二区| 夜夜嗨av一区二区三区网站四季av| 国产乱论精品| 影院欧美亚洲| 精品视频国内| 日本亚洲欧洲无免费码在线| 日本一区二区高清不卡| 免费成人性网站| av资源新版天堂在线| 亚洲精品三级| 99视频精品全国免费| 国产精品成人一区二区网站软件| 欧美特黄视频| 精品日韩在线| 少妇精品在线| 亚洲女同一区| 中文字幕在线看片| 久久av中文| 日韩在线观看中文字幕| 五月天激情综合网| 久久久久久久欧美精品| 欧美日韩精品在线一区| 国产精品网站在线看| 亚洲一区免费| 香蕉成人av| 成人在线视频免费| 国产三级精品三级在线观看国产| 香蕉成人久久| 91成人网在线观看| 成人欧美一区二区三区的电影| 国产欧美在线| 日产欧产美韩系列久久99| 欧美日韩四区| 久久精品国语| 国产精品久久久久蜜臀| 国产精品一区二区免费福利视频| 一本色道久久精品| 激情综合激情| 成人日韩av| 久久精品系列| 国产精品久久久久久久久久齐齐| 最新亚洲国产| 美女精品一区| 亚洲女人av| 一区在线观看| 美女网站一区| 久久久777| 蜜桃视频在线网站| 麻豆mv在线观看| 国产第一亚洲| 蜜桃视频一区二区三区| 亚洲无线一线二线三线区别av| 97国产成人高清在线观看| 精品视频亚洲| 精品少妇av| 国产精品久久久久久久久妇女| 精品伊人久久久| 精品女同一区二区三区在线观看| 国产日韩欧美| 国产私拍福利精品视频二区| 日韩不卡在线观看日韩不卡视频 | 国产日韩视频在线| 日韩精品一区二区三区中文 | 喷白浆一区二区| 久久午夜影视| 综合激情视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 天堂成人国产精品一区| 亚洲欧美视频一区二区三区| 蜜臀va亚洲va欧美va天堂| 亚洲一级淫片| 99热精品在线观看| 久久国产高清| 亚洲精品高潮| 日韩高清中文字幕一区| 日本综合精品一区| 国产精品手机在线播放| 美女尤物国产一区| 色乱码一区二区三区网站| 久久av日韩| 免费看av不卡| 国产在线成人| 蜜乳av另类精品一区二区| 日韩在线网址| 精品一区二区三区视频在线播放| 福利在线一区| 国产91久久精品一区二区| 中日韩男男gay无套| 亚洲精品麻豆| 国产精品v一区二区三区| 麻豆成人av在线| 欧美日韩视频网站| 亚洲一区中文| 91精品国产自产观看在线| 久久av超碰| 久久精品国产亚洲夜色av网站 | 欧美福利一区| 日本不卡中文字幕| 久久精品亚洲| 99成人在线视频| 只有精品亚洲| 国产精品任我爽爆在线播放| 91亚洲成人| 在线国产一区二区| 天堂久久av| 高清在线一区| 亚洲综合国产| 麻豆国产欧美日韩综合精品二区| 日韩精品一区二区三区免费观影| 天使萌一区二区三区免费观看| 日本午夜精品一区二区三区电影| 精品一区二区三区中文字幕| 欧美99久久| 国产亚洲欧美日韩精品一区二区三区 | 欧美1级日本1级| 天堂久久一区| 日韩av片子| 亚洲午夜免费| 在线手机中文字幕| 色综合视频一区二区三区日韩| 久久精品伊人| 一本色道久久精品| 久久av综合| 国产亚洲欧洲| 成人亚洲一区二区| 亚洲精品中文字幕99999| 深夜福利视频一区二区| 一区二区三区四区精品视频| a天堂资源在线| 日韩综合一区二区三区| 日韩欧美二区| 国产色噜噜噜91在线精品| 欧美午夜精品一区二区三区电影| 人人精品久久| 国产综合欧美| 欧美精品二区| 免费观看日韩电影|