自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

動態(tài)調(diào)用動態(tài)語言之Java腳本API

開發(fā) 后端
我們不需要將動態(tài)語言編譯為 Java字節(jié)碼就可以在 Java 應(yīng)用程序中使用它們,請看以下Java腳本API的區(qū)別.

我們不需要將動態(tài)語言編譯為Java字節(jié)碼就可以在 Java 應(yīng)用程序中使用它們。使用 Java Platform, Standard Edition 6 (Java SE)中添加的腳本包(并且向后兼容 Java SE 5),Java 代碼可以在運行時以一種簡單的、統(tǒng)一的方式調(diào)用多種動態(tài)語言。本系列文章共分兩個部分,第 1 部分將介紹 Java 腳本 API 的各種特性。文章將使用一個簡單的 Hello World 應(yīng)用程序展示 Java 代碼如何執(zhí)行腳本代碼以及腳本如何反過來執(zhí)行 Java 代碼。第 2 部分將深入研究 Java 腳本 API 的強大功能。

Java 開發(fā)人員清楚 Java 并不是在任何情況下都是最佳的語言。今年,1.0 版本的 JRuby 和 Groovy 的發(fā)行引領(lǐng)了一場熱潮,促使人們紛紛在自己的 Java 應(yīng)用程序中添加動態(tài)語言。Groovy、JRuby、Rhino、Jython 和一些其他的開源項目使在所謂的腳本語言中編寫代碼并在 JVM 中運行成為了可能(請參閱 參考資料)。通常,在 Java 代碼中集成這些語言需要對各種解釋器所特有的API 和特性有所了解。

Java SE 6 中添加的 javax.script 包使集成動態(tài)語言更加容易。通過使用一小組接口和具體類,這個包使我們能夠簡單地調(diào)用多種腳本語言。但是,Java 腳本 API 的功能不只是在應(yīng)用程序中編寫腳本;這個腳本包使我們能夠在運行時讀取和調(diào)用外部腳本,這意味著我們可以動態(tài)地修改這些腳本從而更改運行應(yīng)用程序的行為。

Java 腳本API

腳本與動態(tài)的對比

術(shù)語腳本 通常表示在解釋器 shell 中運行的語言,它們往往沒有單獨的編譯步驟。術(shù)語動態(tài) 通常表示等到運行時判斷變量類型或?qū)ο笮袨榈恼Z言,往往具有閉包和連續(xù)特性。一些通用的編程語言同時具有這兩種特性。此處首選腳本語言 是因為本文的著重點是 Java 腳本API,而不是因為提及的語言缺少動態(tài)特性。

2006 年 10 月,Java 語言添加了腳本包,從而提供了一種統(tǒng)一的方式將腳本語言集成到 Java 應(yīng)用程序中去。對于語言開發(fā)人員,他們可以使用這個包編寫粘連代碼(glue code),從而使人們能夠在 Java 應(yīng)用程序中調(diào)用他們的語言。對于 Java 開發(fā)人員,腳本包提供了一組類和接口,允許使用一個公共 API 調(diào)用多種語言編寫的腳本。因此,腳本包類似于不同語言(比如說不同的數(shù)據(jù)庫)中的 Java Database Connectivity (JDBC) 包,可以使用一致的接口集成到 Java 平臺中去。這就是Java腳本API的產(chǎn)生。

以前,在 Java 代碼中,動態(tài)調(diào)用腳本語言涉及到使用各種語言(包括動態(tài)語言)發(fā)行版所提供的獨特類或使用 Apache 的 Jakarta Bean Scripting Framework (BSF)。BSF 在一個 API 內(nèi)部統(tǒng)一了一組腳本語言(請參閱 參考資料)。使用 Java SE 6 腳本 API,二十余種腳本語言(AppleScript、Groovy、JavaScript、Jelly、PHP、Python、Ruby 和 Velocity)都可以集成到 Java 代碼中,這在很大程序上依賴的是 BSF。

腳本 API 在Java 應(yīng)用程序和外部腳本之間提供了雙向可見性。Java 代碼不僅可以調(diào)用外部腳本,而且還允許那些腳本訪問選定的 Java 對象。比如說,外部 Ruby 腳本可以對 Java 對象調(diào)用方法,并訪問對象的屬性,從而使腳本能夠?qū)⑿袨樘砑拥竭\行中的應(yīng)用程序中(如果在開發(fā)時無法預(yù)計應(yīng)用程序的行為)。

調(diào)用外部腳本可用于運行時應(yīng)用程序增強、配置、監(jiān)控或一些其他的運行時操作,比如說在不停止應(yīng)用程序的情況下修改業(yè)務(wù)規(guī)則。腳本包可能的作用包括:

·在比 Java 語言更簡單的語言中編寫業(yè)務(wù)規(guī)則,而不用借助成熟的規(guī)則引擎。
·創(chuàng)建插件架構(gòu),使用戶能夠動態(tài)地定制應(yīng)用程序。
·將已有腳本集成到 Java 應(yīng)用程序中,比如說處理或轉(zhuǎn)換文件文章的腳本。
·使用成熟的編程語言(而不是屬性文件)從外部配置應(yīng)用程序的運行時行為。
·在 Java 應(yīng)用程序中添加一門特定于域的語言(domain-specific language)。
·在開發(fā) Java 應(yīng)用程序原型的過程中使用腳本語言。
·在腳本語言中編寫應(yīng)用程序測試代碼。

你好,腳本世界

HelloScriptingWorld 類(本文中的相關(guān)代碼均可從 下載部分 獲得)演示了 Java 腳本包的一些關(guān)鍵特性。它使用硬編碼的 JavaScript 作為示例腳本語言。此類的 main() 方法(如清單 1 所示)將創(chuàng)建一個 JavaScript 腳本引擎,然后分別調(diào)用五個方法(在下文的清單中有顯示)用于突出顯示腳本包的特性。

清單 1. HelloScriptingWorld main 方法

public static void main(String[] args) throws ScriptException, NoSuchMethodException {

ScriptEngineManager scriptEngineMgr = new ScriptEngineManager();
ScriptEngine jsEngine = scriptEngineMgr.getEngineByName("JavaScript");

if (jsEngine == null) {
System.err.println("No script engine found for JavaScript");
System.exit(1);
}

System.out.println("Calling invokeHelloScript...");
invokeHelloScript(jsEngine);

System.out.println("\nCalling defineScriptFunction...");
defineScriptFunction(jsEngine);

System.out.println("\nCalling invokeScriptFunctionFromEngine...");
invokeScriptFunctionFromEngine(jsEngine);

System.out.println("\nCalling invokeScriptFunctionFromJava...");
invokeScriptFunctionFromJava(jsEngine);

System.out.println("\nCalling invokeJavaFromScriptFunction...");
invokeJavaFromScriptFunction(jsEngine);
}

main() 方法的主要功能是獲取一個 javax.script.ScriptEngine 實例(清單 1 中的前兩行代碼)。腳本引擎可以在特定的語言中加載并執(zhí)行腳本。它是 Java 腳本包中使用最為頻繁、作用最為重要的類。我們從 javax.script.ScriptEngineManager 獲取一個腳本引擎(第一行代碼)。通常,程序只需要獲取一個腳本引擎實例,除非使用了很多種腳本語言。

ScriptEngineManager 類

ScriptEngineManager 可能是腳本包中惟一一個經(jīng)常使用的具體類;其他大多數(shù)都是接口。它或許是腳本包中惟一的一個要直接或間接地(通過 Spring Framework 之類的依賴性注入機制)實例化的類。ScriptEngineManager 可以使用以下三種方式返回腳本引擎:

·通過引擎或語言的名稱,比如說 清單 1 請求 JavaScript 引擎。
·通過該語言腳本共同使用的文件擴展名,比如說 Ruby 腳本的 .rb。
·通過腳本引擎聲明的、知道如何處理的 MIME 類型。
  
本文示例為什么要使用JavaScript?

本文中的 Hello World 示例使用了部分 JavaScript 腳本,這是因為 JavaScript 代碼易于理解,不過主要還是因為 Sun Microsystems 和 BEA Systems 所提供的 Java 6 運行時環(huán)境附帶有基于 Mozilla Rhino 開源 JavaScript 實現(xiàn)的 JavaScript 解釋器。使用 JavaScript,我們無需在類路徑中添加腳本語言 JAR 文件。

ScriptEngineManager 間接查找和創(chuàng)建腳本引擎。也就是說,當(dāng)實例化腳本引擎管理程序時,ScriptEngineManager 會使用 Java 6 中新增的服務(wù)發(fā)現(xiàn)機制在類路徑中查找所有注冊的 javax.script.ScriptEngineFactory 實現(xiàn)。這些工廠類封裝在 Java 腳本 API 實現(xiàn)中;也許您永遠都不需要直接處理這些工廠類。

ScriptEngineManager 找到所有的腳本引擎工廠類之后,它會查詢各個類并判斷是否能夠創(chuàng)建所請求類型的腳本引擎 —— 清單 1 中為 JavaScript 引擎。如果工廠說可以創(chuàng)建所需語言的腳本引擎,那么管理程序?qū)⒁蠊S創(chuàng)建一個引擎并將其返回給調(diào)用者。如果沒有找到所請求語言的工廠,那么管理程序?qū)⒎祷?null,清單 1 中的代碼將檢查 null 返回值并做出預(yù)防。

【編輯推薦】

  1. Java heap space問題的的解決方法
  2. Enterprise JavaBeans EJB技術(shù)
  3. Groovy如何幫助JavaFX:別了,純粹的Java代碼?
責(zé)任編輯:王觀 來源: 論壇整理
相關(guān)推薦

2009-08-17 10:08:24

2020-06-19 12:59:33

動態(tài)腳本Java

2010-03-25 16:31:55

Python代碼

2011-01-14 14:15:11

Linux匯編語言

2011-01-14 14:22:50

Linux匯編語言

2011-01-06 09:00:01

靜態(tài)語言動態(tài)語言

2011-08-24 13:32:17

2009-07-27 10:08:48

Java 7動態(tài)語言JVM

2010-01-15 18:17:39

VB.NET動態(tài)標(biāo)識

2023-03-15 15:58:11

Python動態(tài)庫C++

2022-01-13 10:30:21

C語言內(nèi)存動態(tài)

2009-06-16 16:09:54

動態(tài)語言Swing

2011-06-20 13:54:41

Qt 動態(tài) 切換

2010-02-02 16:22:37

Python動態(tài)類型語

2009-08-11 08:46:21

Snow動態(tài)編程語言

2009-06-10 16:09:56

netbeans ru動態(tài)語言

2022-03-16 07:59:54

項目語言包JSON 文件

2012-06-02 01:41:00

GroovyJVMJava

2009-09-16 16:35:08

OSGi是什么OSGi容器

2009-06-22 09:56:00

J2EE web se
點贊
收藏

51CTO技術(shù)棧公眾號