《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > Java 平臺的擴展機制

Java 平臺的擴展機制

2008-12-19
作者:王秀峰,李利

一、什么是擴展機制,?

從1.2版開始,,Java 平臺引入了一種機制——擴展(Extension),這種機制提供了一種標準的,、方便的方式,,以使在同一Java平臺上運行的應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序都能使用客戶提供的(非平臺本身提供的)API。通過擴展機制,,可以使用一些自己所寫的包和類對Java平臺進行增強,,我們暫且稱這些類或包為“擴展”。采用擴展機制,,不用在類路徑(classpath)上添加“擴展”,,運行環(huán)境也能找到并加載" title="加載">加載這些“擴展” 。從這一點看,,“擴展”就像Java平臺的核心類一樣,,這也正是這些類之所以稱為“擴展”的原因——它們實際上是對Java平臺核心API進行了擴展,,更加加強了“Write Once,,Run Anywhere”的理念,。

如圖1所示,“擴展”就是將類打包成“JAR”文件,成為Java平臺的可添加的模塊,,它們的類和公共的API對于運行在Java平臺上的任何應(yīng)用程序都是可以使用的,。不但如此,,Java的擴展機制還提供了一種通過遠程下載供Applet使用“擴展”的方式。

二,、擴展的方式

有兩種擴展方式,分別適于不同的環(huán)境,,下面我們通過簡單示例說明如何應(yīng)用Java平臺的擴展機制,。

方式一:安裝擴展?

“安裝擴展”是指將“擴展”的JAR文件放在Java運行環(huán)境(JRE)軟件安裝" title="軟件安裝">軟件安裝目錄中的/lib/ext目錄下(注意:是JRE軟件安裝目錄下的/lib/ext/目錄)。JRE是Java開發(fā)工具包(Java Development Kit,,JDK)的運行部分,,JRE既可以單獨使用,也可以作為JDK的一部分而使用(如果只是提供運行環(huán)境,,而不是用以開發(fā),,僅僅安裝JRE就可以了)。JDK軟件的目錄樹如下所示:

JRE就是上圖中灰色部分,,它是JDK的真子集,。不論JRE是單獨使用,還是作為JDK的一部分,,在JRE中的 /lib/ext目錄下的任何JAR文件都自動作為運行環(huán)境的“擴展”,。

例如,我們創(chuàng)建一個簡單的“擴展”,,含有一個類Square,,用于計算一個整數(shù)的平方。代碼如下:

public final class Square{

?????? public static int getSquare(int a){

????????????? return a*a;

?????? }

}

Square 類含有一個方法——getSquare,,它以一個整數(shù)為參數(shù),返回這個整數(shù)的平方,。

假使有一個應(yīng)用程序(Application)——ComputeSquareApp,,要使用Square類,代碼如下:

public class ComputeSquareApp{

?????? public static void main(String[] args){

????????????? int s=10;

????????????? System.out.println('整數(shù)'+s+'的平方是'+Square.getSquare(s));

?????? }

}

假如我們已將Square類打包成square.jar文件,,那么在不使用擴展機制的情況下怎么運行ComputeSquareApp這個應(yīng)用程序呢,?因為Square類不是Java平臺的一部分(是我們自己定義的類),所以,,如果square.jar是在目錄 c:myjava下,,為了正常運行ComputeSquareApp,則應(yīng)當(dāng)使用如下命令:

java –classpath ?.;c:myjavasquare.jar ComputeSq?

也就是命令中的類路徑既要包含ComputeSquareApp.class文件所在的當(dāng)前目錄,,又要包含square.jar的路徑,。

下面我們看一下在采用擴展機制時如何運行ComputeSquareApp程序。要使Square類成為“擴展”,,需要將square.jar文件放在JRE的 lib/ext目錄下,,這樣,就使Square類自動成為安裝方式" title="安裝方式">安裝方式的“擴展”,。因為我們將square.jar作為安裝方式的“擴展”,,運行環(huán)境就能夠找到并加載Square類,,即使我們不指定Square的類路徑。這樣,,我們在命令行直接輸入下面不帶類路徑的命令,,就能運行程序:

java ComputeSquareApp?

同樣,在這個做了擴展的系統(tǒng)下運行的任何Applet或Application都可以找到并使用Square類,。

方式二:“下載擴展”?

“下載擴展”是指在其它JAR文件的清單(manifest)文件的Class-Path頭中列出的JAR文件中的類,,“下載擴展”不像“安裝擴展”那樣處于JRE中,它僅是在需要時從所指定的URL加載,。例如,,a.jar和b.jar是兩個在同一目錄下的JAR文件,a.jar的manifest文件包含下面的" title="面的">面的頭:

Class-Path:b.jar

那么b.jar中的類就可用作a.jar中類的“下載擴展”,,這樣b.jar中的類不用寫在類路徑上,,a.jar中的類就可以調(diào)用b.jar中的類(a.jar自身可以是也可以不是“擴展”)。

為了更好理解“下載擴展”,,讓我們看一個例子,。

假如我們創(chuàng)建了一個要使用前面Square類的Applet——ComputeSquareApplet:

import java.applet.Applet;

import java.awt.*;

public class ComputeSquareApplet extends Applet {

??? int s=10;

???

??? public void paint(Graphics g) {

??????? g.drawString('整數(shù)'+s+'的平房是'

????????????????????? + Square.getSquare(s), 10, 10);

??? }

}

這個Applet通過調(diào)用Square類的方法getSquare計算一個整數(shù)的平方。然而,,這個Applet是下載到調(diào)用方的機器上運行的,,調(diào)用方的系統(tǒng)中并沒有Square類,所以若不采取措施ComputeSquareApplet是不能正常運行的,。解決這個問題的方式之一就是將Square類做成“下載擴展”,,在ComputeSquareApplet運行時可以加載“下載擴展”。

如何做呢,?首先將Square類打包成Square.jar文件,,將ComputeSquareApplet打包成ComputeSquareApplet.jar文件(須將Square.jar列到ComputeSquareApplet.jar的manifest文件頭部的Class-Path中),這樣Square類就會被當(dāng)做“下載擴展” ,。ComputeSquareApplet.jar的manifest文件就像下面這樣:

Manifest-Version: 1.0

Class-Path: RectangleArea.jar

上面ComputeSquareApplet.jar的manifest文件的Class-Path沒有特別指明路徑,,表示Square.jar和ComputeSquareApplet.jar處于同一個目錄中。

另外,,如果Applet或Application使用了不止一個擴展,,我們可以在manifest文件中列出多個URL,例如,,下面就是一個有效的Class-Path頭:

Class-Path: area.jar servlet.jar ?images/

在Class-Path頭中列出的URL如果不是以“/”結(jié)尾,,就表示是JAR文件,如果以“/”結(jié)尾則表示是目錄,,在上面的例子中,,images/就是目錄,其中含有Applet或Application所需的資源,。

我們還可以使用多個Class-Path頭指定多個擴展的URL,。例如:

Class-Path: area.jar

Class-Path: servlet.jar

“下載擴展”還可以是“擴展鏈”,,也就是一個“下載擴展”還可以有一個“Class-Path”頭指向另一個“擴展”,第二個“擴展”還可以指向第三個“擴展”,,……

三,、擴展機制的背后

為什么使用“擴展”就不用指明類路徑了呢?是因為擴展機制利用了Java平臺(1.2版之后)的新類加載機制,。當(dāng)需要為應(yīng)用程序加載一個新的類時,,運行環(huán)境從以下位置并且按以下順序搜索這個新類:

1.????????????? 引導(dǎo)(Bootstrap)類:rt.jar文件中的運行時類以及i18n.jar文件中的國際化類。

2.????????????? “安裝擴展”:JRE中l(wèi)ib/ext目錄下JAR文件中的類,。

3.????????????? 指明的類路徑:系統(tǒng)屬性java.class.path所指明的路徑下的類以及這些路徑下的JAR文件中的類,。如果類路徑中的JAR文件的manifest文件帶有Class-Path屬性,那么Class-Path所指定的類也會被搜索,。默認情況下,,java.class.path屬性的值是“.”,即當(dāng)前路徑,,我們可以通過設(shè)置環(huán)境變量“CLASSPATH”或者在命令行中使用“-classpath”或“-cp”選項改變這個屬性值,。

按照上面的順序,我們可知只有在rt.jar,、i18n.jar以及“安裝擴展”中沒有找到所需的類時,,才會在類路徑所指的地方進行搜索。我們采用擴展機制時,,由于運行環(huán)境自動從“安裝擴展”中加載所需的類,,因此,就不用再特別指明類路徑了,。

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容,、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。