日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JAVA的嵌入式脚本开发(中)

發(fā)布時(shí)間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA的嵌入式脚本开发(中) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文將分以下幾個(gè)小節(jié)來(lái)學(xué)習(xí):

  • Java的JavaScript腳本引擎
  • 腳本開(kāi)發(fā)中涉及到的類和接口簡(jiǎn)介
  • 開(kāi)發(fā)步驟
  • 腳本與java數(shù)據(jù)傳遞
  • 腳本執(zhí)行上下文
  • 作用域
  • 方法的調(diào)用
  • 編譯腳本

腳本與java數(shù)據(jù)傳遞

腳本語(yǔ)言支持API的一個(gè)很大的優(yōu)勢(shì)在于它規(guī)范了Java語(yǔ)言與腳本語(yǔ)言之間的交互方式,使Java語(yǔ)言編寫的程序可以和腳本之間進(jìn)行雙向的方法調(diào)用和數(shù)據(jù)傳遞。

數(shù)據(jù)傳遞是通過(guò)Bindings接口來(lái)實(shí)現(xiàn)的,其實(shí)Bindings對(duì)象就是一個(gè)簡(jiǎn)單的哈希表,用來(lái)存放和獲取所需的共享數(shù)據(jù)。所有數(shù)據(jù)都對(duì)應(yīng)這個(gè)哈希表中的一個(gè)條目,是簡(jiǎn)單的鍵值對(duì)。

ScriptEngine對(duì)象中有個(gè)默認(rèn)的Bindings對(duì)象,提供了put和get方法對(duì)腳本引擎中特定作用域的數(shù)據(jù)傳遞。

Demo:

package net.oseye;import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException;public class ScriptTest {public static void main(String[] args) throws ScriptException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");se.put("name", "kevin");se.eval("var msg='my name is '+name;println(msg);");System.out.println(se.get("msg"));} }

輸出:

my name is kevin my name is kevin

ScriptEngine對(duì)象通過(guò)put方法向腳本默認(rèn)Bindings對(duì)象添加鍵為"name",值為"kevin"的字符串,然后eval中可直接使用name。在java中可通過(guò)ScriptEngine對(duì)象的get方法獲取到腳本的變量msg。這樣就完成了Java和腳本預(yù)言的雙向數(shù)據(jù)傳遞。

在大多說(shuō)情況下使用ScriptEngine的默認(rèn)Bindings對(duì)象就足夠的,但如果不夠,你可以使用自己的Bindings對(duì)象。可以使用ScriptEngine對(duì)象的creteBindings方法或new一個(gè)javax.script.SimpleBindings對(duì)象來(lái)創(chuàng)建。Demo:

package net.oseye; import javax.script.*; public class ScriptTest {public static void main(String[] args) throws ScriptException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript"); // Bindings bindings=new SimpleBindings();Bindings bindings=se.createBindings();bindings.put("name", "kevin");se.eval("var msg='my name is '+name;println(msg);",bindings);System.out.println(bindings.get("msg"));} }

腳本執(zhí)行上下文

腳本引擎通過(guò)ScriptContext接口對(duì)象獲取與腳本執(zhí)行相關(guān)的信息,也允許開(kāi)發(fā)人員通過(guò)此對(duì)象來(lái)配置腳本引擎的行為。

  • 輸入與輸出
    在默認(rèn)情況下,腳本的輸入和輸出都發(fā)生在標(biāo)準(zhǔn)的控制臺(tái)中,但可以用ScriptContext接口對(duì)象讓腳本在執(zhí)行中用java.io.Reader對(duì)象來(lái)輸入,用java.io.Writer對(duì)象來(lái)輸出。例如把腳本的輸出寫入到一根文件中,就可以利用setWriter方法把腳本輸出重定向到一個(gè)文件中。 package net.oseye; import java.io.*; import javax.script.*;public class ScriptTest {public static void main(String[] args) throws ScriptException, IOException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");ScriptContext sc=se.getContext();sc.setWriter(new FileWriter("out.txt"));se.eval("println('test')");} } 通過(guò)ScriptContext的setReader和setErrorWriter方法可以分別設(shè)置腳本執(zhí)行時(shí)的數(shù)據(jù)輸入來(lái)源和產(chǎn)生錯(cuò)誤時(shí)出錯(cuò)信息的輸出目的。
  • 自定義屬性
    ScriptContext也有獲取和設(shè)置屬性的方法,這點(diǎn)類似SeverletContext,即setAttribute和getAttribute。 package net.oseye; import java.io.*; import javax.script.*;public class ScriptTest {public static void main(String[] args) throws ScriptException, IOException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");ScriptContext sc=se.getContext();sc.setAttribute("name", "kevin", ScriptContext.GLOBAL_SCOPE);se.eval("println(name)");} } 輸出: kevin

轉(zhuǎn)載于:https://www.cnblogs.com/zhaiqianfeng/archive/2013/01/07/4618252.html

總結(jié)

以上是生活随笔為你收集整理的JAVA的嵌入式脚本开发(中)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。