摘要:知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)執(zhí)行代碼知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作之后提供了腳本引擎功能,讓我們可以執(zhí)行某些腳本語(yǔ)言,特別是是一門(mén)解釋性語(yǔ)言,動(dòng)態(tài)性非常好。腳本為開(kāi)發(fā)者提供了如下功能獲取腳本程序輸入,通過(guò)腳本引擎運(yùn)行腳本并返回運(yùn)行結(jié)果,這是最核心的接口。
Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)執(zhí)行JS代碼 )
@(Java知識(shí)點(diǎn)總結(jié))[Java, 動(dòng)態(tài)字節(jié)碼操作]
JDK6.0之后提供了腳本引擎功能,讓我們可以執(zhí)行某些腳本語(yǔ)言,特別是javascript(javascript是一門(mén)解釋性語(yǔ)言,動(dòng)態(tài)性非常好)。
讓JAVA的動(dòng)態(tài)性得到更充分的體現(xiàn),某些時(shí)候可以更加靈活的應(yīng)對(duì)需求的變化。
使得 Java 應(yīng)用程序可以通過(guò)一套固定的 接口與各種腳本引擎 交互,從而達(dá)到在 Java 平臺(tái)上調(diào)用各種腳本語(yǔ)言的目的 。
Java 腳本 API 是連通 Java 平臺(tái)和腳本語(yǔ)言 的 橋梁 。
可以把一些復(fù)雜異變的業(yè)務(wù)邏輯交給腳本語(yǔ)言處理,這又大大提高了開(kāi)發(fā)效率。
獲取腳本程序輸入,通過(guò)腳本引擎運(yùn)行腳本并返回運(yùn)行結(jié)果,這是最核心的接口。
注意是:接口。 Java可以使用各種不同的實(shí)現(xiàn),從而通用的調(diào)用 js 、 groovy 、 python 等腳本。
通過(guò) 腳本引擎 的運(yùn)行上下文在腳本和 Java 平臺(tái)間交換數(shù)據(jù)。
通過(guò) Java 應(yīng)用程序調(diào)用腳本函數(shù)。
Rhino 是一種使用 Java 語(yǔ)言編寫(xiě)的 JavaScript 的開(kāi)源實(shí)現(xiàn),原先由Mozilla開(kāi)發(fā),現(xiàn)在被集成進(jìn)入JDK 6.0。
官方首頁(yè)
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Test09 { // 定義變量,存儲(chǔ)到引擎上下文中 private static void test1(ScriptEngine engine) { engine.put("msg", "張三是個(gè)好學(xué)生"); System.out.println(engine.get("msg")); // 獲取變量的值 try { engine.eval("msg="java是門(mén)好用的語(yǔ)言";"); // 修改變量的值 } catch (ScriptException e1) { e1.printStackTrace(); } System.out.println(engine.get("msg")); } // 定義一個(gè)對(duì)象 private static void test2(ScriptEngine engine) { String str = "var user = {name:"張三",age:18,subjects:["計(jì)算機(jī)","英語(yǔ)"]};"; str += "println(user.name);"; try { engine.eval(str); } catch (ScriptException e) { e.printStackTrace(); } } // 定義一個(gè)函數(shù) private static void test3(ScriptEngine engine) { try { engine.eval("function add(a,b){var sum = a+b;return sum;}"); } catch (ScriptException e) { e.printStackTrace(); } try { // 取得調(diào)用接口 Invocable jsInvoke = (Invocable) engine; // 執(zhí)行腳本中定義的方法 Object result = jsInvoke.invokeFunction("add", new Object[] { 13, 20 }); System.out.println(result); } catch (NoSuchMethodException | ScriptException e) { e.printStackTrace(); } } // 導(dǎo)入其他java包,使用其他包中的java類(lèi) private static void test4(ScriptEngine engine) { String jsCode = "importPackage(java.util); var list = Arrays.asList(["浙江大學(xué)","清華大學(xué)","北京大學(xué)"]); "; try { engine.eval(jsCode); } catch (ScriptException e) { e.printStackTrace(); } Listlist2 = (List ) engine.get("list"); for (String temp : list2) { System.out.println(temp); } } //執(zhí)行一個(gè)js文件(我們將a.js至于項(xiàng)目的src下即可) private static void test5(ScriptEngine engine) { URL is = Test09.class.getClassLoader().getResource("a.js"); Reader r= null; try { r = new FileReader(is.getPath()); engine.eval(r); } catch (FileNotFoundException | ScriptException e) { e.printStackTrace(); }finally { try { r.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 獲得腳本引擎 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName("javascript"); test1(engine); test2(engine); // java 8 出現(xiàn)異常:Caused by: :1 ReferenceError: "println" is not defined test3(engine); test4(engine); // java 8出現(xiàn)異常:Caused by: :1 ReferenceError: "importPackage" is not defined test5(engine); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96190.html
摘要:知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)執(zhí)行代碼知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作之后提供了腳本引擎功能,讓我們可以執(zhí)行某些腳本語(yǔ)言,特別是是一門(mén)解釋性語(yǔ)言,動(dòng)態(tài)性非常好。腳本為開(kāi)發(fā)者提供了如下功能獲取腳本程序輸入,通過(guò)腳本引擎運(yùn)行腳本并返回運(yùn)行結(jié)果,這是最核心的接口。 Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)執(zhí)行JS代碼 ) @(Java知識(shí)點(diǎn)總結(jié))[Java, 動(dòng)態(tài)字節(jié)碼操作] JDK6.0之后提供了腳本引擎功能,讓我們可以執(zhí)行某些...
摘要:知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作介紹知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能動(dòng)態(tài)生成新的類(lèi)動(dòng)態(tài)改變某個(gè)類(lèi)的結(jié)構(gòu)添加刪除修改新的屬性方法常見(jiàn)的字節(jié)碼操作類(lèi)庫(kù),這是的項(xiàng)目的一部分。 Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)字節(jié)碼操作-Javassist介紹) @(Java知識(shí)點(diǎn)總結(jié))[Java, 動(dòng)態(tài)字節(jié)碼操作] 運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能: 動(dòng)態(tài)生成新的類(lèi) 動(dòng)態(tài)改變某個(gè)類(lèi)的結(jié)...
摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...
閱讀 3578·2021-09-24 09:48
閱讀 1105·2021-09-10 10:51
閱讀 3283·2019-08-30 13:03
閱讀 3331·2019-08-30 12:51
閱讀 1399·2019-08-30 11:22
閱讀 1074·2019-08-29 18:38
閱讀 2045·2019-08-29 16:41
閱讀 3216·2019-08-29 15:32