摘要:知識點總結動態執行代碼知識點總結動態字節碼操作之后提供了腳本引擎功能,讓我們可以執行某些腳本語言,特別是是一門解釋性語言,動態性非常好。腳本為開發者提供了如下功能獲取腳本程序輸入,通過腳本引擎運行腳本并返回運行結果,這是最核心的接口。
Java知識點總結(動態執行JS代碼 )
@(Java知識點總結)[Java, 動態字節碼操作]
JDK6.0之后提供了腳本引擎功能,讓我們可以執行某些腳本語言,特別是javascript(javascript是一門解釋性語言,動態性非常好)。
讓JAVA的動態性得到更充分的體現,某些時候可以更加靈活的應對需求的變化。
使得 Java 應用程序可以通過一套固定的 接口與各種腳本引擎 交互,從而達到在 Java 平臺上調用各種腳本語言的目的 。
Java 腳本 API 是連通 Java 平臺和腳本語言 的 橋梁 。
可以把一些復雜異變的業務邏輯交給腳本語言處理,這又大大提高了開發效率。
獲取腳本程序輸入,通過腳本引擎運行腳本并返回運行結果,這是最核心的接口。
注意是:接口。 Java可以使用各種不同的實現,從而通用的調用 js 、 groovy 、 python 等腳本。
通過 腳本引擎 的運行上下文在腳本和 Java 平臺間交換數據。
通過 Java 應用程序調用腳本函數。
Rhino 是一種使用 Java 語言編寫的 JavaScript 的開源實現,原先由Mozilla開發,現在被集成進入JDK 6.0。
官方首頁
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 { // 定義變量,存儲到引擎上下文中 private static void test1(ScriptEngine engine) { engine.put("msg", "張三是個好學生"); System.out.println(engine.get("msg")); // 獲取變量的值 try { engine.eval("msg="java是門好用的語言";"); // 修改變量的值 } catch (ScriptException e1) { e1.printStackTrace(); } System.out.println(engine.get("msg")); } // 定義一個對象 private static void test2(ScriptEngine engine) { String str = "var user = {name:"張三",age:18,subjects:["計算機","英語"]};"; str += "println(user.name);"; try { engine.eval(str); } catch (ScriptException e) { e.printStackTrace(); } } // 定義一個函數 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 { // 取得調用接口 Invocable jsInvoke = (Invocable) engine; // 執行腳本中定義的方法 Object result = jsInvoke.invokeFunction("add", new Object[] { 13, 20 }); System.out.println(result); } catch (NoSuchMethodException | ScriptException e) { e.printStackTrace(); } } // 導入其他java包,使用其他包中的java類 private static void test4(ScriptEngine engine) { String jsCode = "importPackage(java.util); var list = Arrays.asList(["浙江大學","清華大學","北京大學"]); "; try { engine.eval(jsCode); } catch (ScriptException e) { e.printStackTrace(); } Listlist2 = (List ) engine.get("list"); for (String temp : list2) { System.out.println(temp); } } //執行一個js文件(我們將a.js至于項目的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 出現異常:Caused by: :1 ReferenceError: "println" is not defined test3(engine); test4(engine); // java 8出現異常:Caused by: :1 ReferenceError: "importPackage" is not defined test5(engine); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96190.html
摘要:知識點總結動態執行代碼知識點總結動態字節碼操作之后提供了腳本引擎功能,讓我們可以執行某些腳本語言,特別是是一門解釋性語言,動態性非常好。腳本為開發者提供了如下功能獲取腳本程序輸入,通過腳本引擎運行腳本并返回運行結果,這是最核心的接口。 Java知識點總結(動態執行JS代碼 ) @(Java知識點總結)[Java, 動態字節碼操作] JDK6.0之后提供了腳本引擎功能,讓我們可以執行某些...
摘要:知識點總結動態字節碼操作介紹知識點總結動態字節碼操作運行時操作字節碼可以讓我們實現如下功能動態生成新的類動態改變某個類的結構添加刪除修改新的屬性方法常見的字節碼操作類庫,這是的項目的一部分。 Java知識點總結(動態字節碼操作-Javassist介紹) @(Java知識點總結)[Java, 動態字節碼操作] 運行時操作字節碼可以讓我們實現如下功能: 動態生成新的類 動態改變某個類的結...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
閱讀 3565·2021-09-24 09:48
閱讀 1087·2021-09-10 10:51
閱讀 3267·2019-08-30 13:03
閱讀 3315·2019-08-30 12:51
閱讀 1387·2019-08-30 11:22
閱讀 1051·2019-08-29 18:38
閱讀 2035·2019-08-29 16:41
閱讀 3182·2019-08-29 15:32