91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何深入淺出Rhino以及與Java和JS的關系

發布時間:2021-12-14 11:08:40 來源:億速云 閱讀:168 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關如何深入淺出Rhino以及與Java和JS的關系,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Java SE的亮點之一就是Oracle詳細闡述Java SE 8路線圖。我們先來看看Java SE 8新增了哪些主要功能:

Java SE 8 新增主要功能

1、為提高開發人員工作效率,更好地利用多核處理器和增強對Java集合APIs的大容量數據處理功能,推出的Lambda表達式(“關閉”)。

2、原始Java模塊系統(“項目Jigsaw”)將簡化應用程序的構建、包裝以及部署,讓一個完全模塊化的Java平臺能在服務器、客戶和嵌入式系統上進行定制化部署。

3、在JVM上的JavaScript改進,包括一個為JVM優化的全新JavaScript引擎Nashorn和全面的Java / JavaScript互操作性。

4、具有JavaFX 3.0形式的下一代Java客戶端。包括多點觸摸功能的現代設備支持。

5、完成的HotSpot / JRockit JVM集聚項目,包括性能增強和第二代的Java Flight Recorder。

其中,筆者最關心的是第三條,即JVM對JavaScript的改進。它的核心組件是JavaScript引擎Nashorn,它實現了Java與JavaScript互操作性。Nashorn一詞與Rhino類似,漢語意思均為犀牛。而巧合的是,Rhino就是JavaScript引擎,它的目的就是實現Java與JavaScript的互操作性。那么Rhino究竟是什么呢?為什么說Nashorn是新一代JavaScript引擎?Rhino有什么特性?Rhino與Java及JavaScript有什么關系呢?下面將會為您一一解答。

什么是Rhino?

Rhino 是JavaScript 的一種基于Java的實現,原先由Mozilla開發,現在被集成進入JDK 6.0。下面這兩行代碼恰好說明了這一點。

import sun.org.mozilla.javascript.internal.Context;  import sun.org.mozilla.javascript.internal.Scriptable;

Rhino漢語意思為犀牛,它的名字來源于 O'Reilly 關于 JavaScript 的書的封面,如圖一所示。

如何深入淺出Rhino以及與Java和JS的關系

圖一 “犀牛“的來源

Rhino的特點如下:

JavaScript 1.5的全部特性

◆ 允許使用腳本直接操作Java

◆ 提供JavaScript Shell執行其它JavaScript腳本

◆ 提供JavaScript編譯器將JavaScript源程序轉換成Java類文件

Rhino相關背景

Rhino的歷史可追溯到1997 年。Netscape計劃開發Java版的Navigator,即Javagator。它也就是 Rhino 的前身。雖然 Javagator 未能開花結果,但是Rhino,作為Netscape 對 JavaScript 的移植語言,經過時間考驗存活了下來。

如今,隨著 Rhino 開放源代碼,越來越多的開發者參與了 Rhino 的開發。隨著Rhino的愈加成熟,越來越多的用戶選擇使用了Rhino。

Rhino語言特點

Java是一種面對對象的編譯型語言。它首先將源代碼編譯成二進制字節碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執行字節碼,從而實現了“一次編譯、到處執行”的跨平臺特性。

JavaScript是一種動態、弱類型、基于原型的客戶端腳本語言。JavaScript 包括一個基于對象的 API,稱為文檔對象模型(Document Object Model)或 DOM,用以訪問和操作 Web 頁面的內容,給HTML網頁添加動態功能。

Rhino是一個介于Java與JavaScript之間的語言。它的基礎是 Java 語言,這使得它簡單易學,但相比于JavaScript腳本語言來說,它又太過復雜。不過,Rhino 的主要缺點也正是它的強大之處,Rhino 是一種輕量級的、功能強大的腳本語言。Rhino 使用原型而不是類,這使它比很多腳本語言更適合開發 GUI 應用程序,在考慮性能和風格等因素時更是如此。

Rhino語言特點的優缺點

一方面,作為一種動態類型的、基于原型的腳本語言,Rhino借用了很多JavaScript語法。比如,Rhino不再使用語句結束符( ; ),放寬了變量聲明規則,并且極大地簡化了修改和檢索對象屬性的語法。另一方面,作為JavaScript 的Java實現,Rhino語法非常類似于Java編程語言。比如,Rhino采用了與 Java 編程語言相似的循環和條件結構,并且遵循類似的語法模式來表示這些結構。

Rhino 和 Java 語言之間有一些顯著的區別。Rhino 是一種基于原型的(prototype-based)語言,而不是一種基于類的(class-based)語言。Rhino中,函數和變量的聲明中看不到類型,取而代之的是,使用 function關鍵字聲明函數,使用 var關鍵字聲明局部變量。

Rhino的原始想法是將JavaScript 編譯成Java字節碼執行,即采用編譯執行的方式。由于由于JVM存在垃圾收集、編譯和裝載過程的開銷過大等限制,Rhino采用了解釋執行的方式。

如何下載Rhino安裝包

用戶可以從官網http://www.mozilla.org/rhino/ 下載Rhino,筆者下載的版本為rhino1.7R3.zip。

其中,主要的目錄與文件的如下:

Src:Rhino相關Jar包對應的源代碼

Javadoc:Rhino相關Jar包對應的Java說明文檔

Examples:Rhino相關示例

build.xml:Rhino工程對應的Ant文件

js.jar:Rhino對應的Jar包

Rhino環境配置

在使用之前,我們需要配置環境及運行js腳本。具體如下:

1、 將下載包中的js.jar文件加入系統CLASSPATH中。

2、 運行js解釋器java org.mozilla.javascript.tools.shell.Main。進入交互模式:

Rhino 1.7 release 3 2011 05 09   js>

注:***行為js解釋器的版本號,后面跟著提示符 js>

下面我們將利用js shell,使用JavaScript操縱Java對象。

JavaScript操縱Java對象

1. Rhino如何訪問Java包與類文件

Java語法規定,任何代碼都必須以class文件的形式存在,而每個class文件必須屬于一個package,默認為default。而JavaScript并沒有類似package的層級結構概念,那么如何使用Rhino訪問Java類文件呢?

Rhino定義了一個top-level變量Packages。變量Packages對應的所有屬性均對應Java包名。比如,我們需要訪問某一個Java的Package com.example.

js> Packages.com.example  [JavaPackage com.example]

簡單起見,我們也可以去掉變量Packages,直接輸入Java包名。因此,上述Package com.example等價與com.example,如下:

js> com.example   [JavaPackage com.example]

剛才演示了如何通過js shell訪問Java包,訪問Java類的方式類似。假如我們需要訪問標準的Java 文件類java.io.File,如下。

 js> java.io.File  [JavaClass java.io.File]

或者,為避免輸入全名,我們先導入包,然后輸入Class類名,如下:

js> importPackage(java.io)   js> File   [JavaClass java.io.File]

這里的importPackage(java.io),在效果上等價于Java聲明import java.io.*; 不同的是,Java會隱式import java.lang.*,而Rhino不會。因為Rhino定義的對象Boolean, Math, Number, Object, String等與Java語法完全不同,兩者無法等價。

這里需要注意的是,Rhino對該語法的錯誤處理機制,當被訪問的類存在時,Rhino加載該class,而當其不存在時,則把它當成package名稱,而并不會報錯。例如,當訪問一個不存在的類com.example.AAA時,輸入如下。

js> com.example.AAA  [JavaPackage com.example.AAA]

僅當訪問類AAA時,Rhino才會報錯。

2. Rhino如何與Java對象交互

與Java類似,Rhino使用new操作符創建對象。

js> new java.util.Date()   Thu Nov 03 16:19:04 CST 2011

可以使用JavaScript變量存儲Java對象,并調用其方法,如下:

 js> f = new java.io.File("sample.txt")   sample.txt   js> f.isDirectory()   false

對于static方法與變量,調用如下:

js> java.lang.Math.PI

3.141592653589793

js> java.lang.Math.cos(0)

1

在JavaScript中,方法本身就是對象,這一點與Java不同。我們可以通過下列方式查看方法的重載:

js> f.listFiles  function listFiles() {/*  java.io.File[] listFiles()  java.io.File[] listFiles(java.io.FilenameFilter)  java.io.File[] listFiles(java.io.FileFilter)  */}

輸出中列出三個重載方法。***個為無參函數,第二與第三個對應的參數分別為FilenameFilter與FileFilter。

另一個比較有意思的特點是通過構造for..in,查看對象對應的所有方法與變量。如下:

js> for (i in f) { print(i) }  exists  parentFile  mkdir  toString  wait  [44 others]

這里列出的方法一部分來自于父類,比如wait來自父類java.lang.Object。

對于JavaBean,Rhino也提供按名字訪問的簡單方式。比如,通過下面這種方式,我們就可以調用File對象的getName與isDirectory方法:

 js> f.name   test.txt  js> f.directory   false

3. Rhino如何實現Java接口

JavaScript當中,方法本身就是對象。下面我們通過JavaScript語法{propertyName: value}聲明一個JavaScript方法,并調用該方法如下:

 js> obj = { run: function () { print("\nrunning"); } }   [object Object]   js> obj.run()   running

現在我們構造一個JavaScript對象,實現Runnable接口。并將該對象作為參數,構造一個新的線程,并啟動該線程。

 js> r = new java.lang.Runnable(obj);  adapter1@291aff  js> t = new java.lang.Thread(r)  Thread[Thread-0,5,main]  js> t.start()  js> running

***的js>提示符與新線程的打印輸出running的先后順序是隨機的,取決于線程的調度策略。

從后端的處理流程來講,Rhino首先為Runnable接口的實現類生成Java字節碼文件。然后調用JavaScript對象定義的Run方法。

4. Rhino如何創建Java 數組

Rhino使用Java的發射機制生成數組。下面是生成2個String對象的代碼:

 js> array = java.lang.reflect.Array.newInstance(java.lang.String, 2);  [Ljava.lang.String;@a20892  js> array[0] = "Double"  Double  js> array[1] = "Life"  Life  js> array[0] + array[1]  DoubleLife   js>

5. Rhino如何捕獲與處理異常

與Java類似,Rhino使用try...catch關鍵字處理異常。

 js> function classForName(name) {  try {  return java.lang.Class.forName(name);  } catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {  print("Class " + name + " not found");  } catch (e if e.javaException instanceof java.lang.NullPointerException) {  print("Class name is null");  }  } > > > > > > > > js> classForName("NonExistingClass");  Class NonExistingClass not found  js> classForName(null);  Class name is null

6. Rhino如何調用js文件

當然,除了在命令行的方式,我們還可以使用操縱JavaScript文件。下面是一段JavaScript代碼,主要目的是判斷該數是否為質數。代碼如下:

function isPrime (num)  {  if (num <= 1) {  print("Enter an integer no less than 2.")  return false  }  var prime = true var sqrRoot = Math.round(Math.sqrt(num))  for (var n = 2; prime & n <= sqrRoot; ++n) {  prime = (num % n != 0)  }  return prime  }

我們保存文件為C:\isPrime.js。然后我們需要調用load方法加載該腳本。***,我們可以調用isPrime方法來判斷是否為質數。

js> load("C:/isPrime.js")  js> isPrime(33);  false  js> isPrime(31)  true

需要注意的是,注意:文件分隔符需要調整,是“/”而不是“\”。

上述部分示例可以參見Rhino官方網站https://developer.mozilla.org/en/Scripting_Java。另外examples目錄下很多例子都值得參考與學習。

剛才使用JavaScript操縱Java對象。接下來我們看看如何使用Java程序訪問JavaScript

Java對象操縱JavaScript

下面是一段Java代碼,用來運行數學表達式。代碼如下:

package com.example;  import sun.org.mozilla.javascript.internal.Context;  import sun.org.mozilla.javascript.internal.Scriptable;  publicclass Test {  publicstaticvoid main(String[] args) {  Context cx = Context.enter();  try {  Scriptable scope = cx.initStandardObjects();  String str = "3/(1+2)";  Object result = cx.evaluateString(scope, str, null, 1, null);  System.out.println(str + "=" + Context.toNumber(result));  } finally {  Context.exit();  }  }  }

運行Java com.example.Test,輸出結果如下:

3/(1+2)=1.0

之所以是1.0而不是1,是因為Context.toNumber(result)返回的類型為double。另一個值得注意的是,這里import的package屬于JDK 6.0。因此,在不需要Rhino提供的js.jar,該程序仍能獨立運行。

雖然Rhino作為JavaScript運行時,功能非常強大,但在性能上卻無法與其他的JavaScript運行時(比如Google Chrome的V8 JavaScript Engine)相提并論。值得注意的是,JRuby專家Charles Oliver Nutter也開始參與Rhino項目中,以提升Rhino JavaScript運行時的速度,進而實現與V8的競爭。而Oracle在對JVM上的JavaScript改進與優化,我們有理由期待,在未來,新一代JavaScript運行時Nashorn的速度將會得到極大的提升。

上述就是小編為大家分享的如何深入淺出Rhino以及與Java和JS的關系了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陆良县| 田东县| 平邑县| 抚顺市| 浙江省| 惠安县| 阜城县| 安新县| 淳化县| 云安县| 金门县| 西乡县| 确山县| 宜兰县| 商河县| 夏河县| 沁源县| 遂平县| 泸州市| 巴塘县| 绍兴市| 开封县| 宝兴县| 红河县| 博白县| 峨眉山市| 屏东县| 高平市| 和林格尔县| 海盐县| 海安县| 大兴区| 康保县| 那坡县| 洪泽县| 陇西县| 桐乡市| 石门县| 长海县| 电白县| 行唐县|