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

Java 平臺(tái)的擴(kuò)展機(jī)制

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

一、什么是擴(kuò)展機(jī)制?

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

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

二、擴(kuò)展的方式

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

方式一:安裝擴(kuò)展?

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

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

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

public final class Square{

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

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

?????? }

}

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

假使有一個(gè)應(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文件,那么在不使用擴(kuò)展機(jī)制的情況下怎么運(yùn)行ComputeSquareApp這個(gè)應(yīng)用程序呢?因?yàn)镾quare類不是Java平臺(tái)的一部分(是我們自己定義的類),所以,如果square.jar是在目錄 c:myjava下,為了正常運(yùn)行ComputeSquareApp,則應(yīng)當(dāng)使用如下命令:

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

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

下面我們看一下在采用擴(kuò)展機(jī)制時(shí)如何運(yùn)行ComputeSquareApp程序。要使Square類成為“擴(kuò)展”,需要將square.jar文件放在JRE的 lib/ext目錄下,這樣,就使Square類自動(dòng)成為安裝方式" title="安裝方式">安裝方式的“擴(kuò)展”。因?yàn)槲覀儗quare.jar作為安裝方式的“擴(kuò)展”,運(yùn)行環(huán)境就能夠找到并加載Square類,即使我們不指定Square的類路徑。這樣,我們?cè)诿钚兄苯虞斎胂旅娌粠ь惵窂降拿睿湍苓\(yùn)行程序:

java ComputeSquareApp?

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

方式二:“下載擴(kuò)展”?

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

Class-Path:b.jar

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

為了更好理解“下載擴(kuò)展”,讓我們看一個(gè)例子。

假如我們創(chuàng)建了一個(gè)要使用前面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);

??? }

}

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

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

Manifest-Version: 1.0

Class-Path: RectangleArea.jar

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

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

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

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

我們還可以使用多個(gè)Class-Path頭指定多個(gè)擴(kuò)展的URL。例如:

Class-Path: area.jar

Class-Path: servlet.jar

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

三、擴(kuò)展機(jī)制的背后

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

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

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

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

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

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲一二三四区| 在线天堂一区av电影| 亚洲精品乱码久久久久久黑人 | 亚洲精品社区| 亚洲国产一成人久久精品| 黄色亚洲在线| 韩国欧美一区| 国内精品久久国产| 激情久久一区| 在线观看av不卡| 亚洲第一页自拍| 亚洲风情亚aⅴ在线发布| 亚洲高清av| 亚洲精品1234| 亚洲精品婷婷| 中文在线资源观看网站视频免费不卡| 日韩亚洲欧美精品| 一区二区三区产品免费精品久久75 | 国产精品九九| 一级成人国产| 99精品久久久| 亚洲一区二区少妇| 亚洲欧美日韩一区二区三区在线观看| 亚洲天堂男人| 午夜亚洲激情| 久久精品亚洲一区二区| 久久综合给合久久狠狠狠97色69| 蜜桃av一区| 欧美激情综合| 国产精品国产三级国产普通话三级 | 国产欧美一区二区三区沐欲| 国产日韩欧美日韩大片| 激情综合色丁香一区二区| 亚洲高清激情| aⅴ色国产欧美| 亚洲欧美日韩中文视频| 久久国产加勒比精品无码| 亚洲精品美女在线| 一区二区三区四区五区精品视频 | 在线观看亚洲精品| 亚洲免费成人av电影| 亚洲一区二区在线免费观看视频| 欧美亚洲一级片| 最新成人av网站| 亚洲男人影院| 久久人人爽人人爽| 欧美激情综合色综合啪啪| 国产精品久久久久久久久久久久久| 国产日韩欧美精品综合| 亚洲丰满在线| 亚洲香蕉网站| 亚洲国产欧美一区二区三区同亚洲| 99视频在线观看一区三区| 午夜视频在线观看一区二区| 久久综合狠狠| 国产精品99一区二区| 韩国免费一区| 一本色道久久综合亚洲精品按摩| 欧美一区二区三区久久精品| 99国产麻豆精品| 欧美主播一区二区三区| 欧美激情亚洲一区| 国产欧美日韩视频| 亚洲美女av在线播放| 午夜亚洲精品| 夜夜爽av福利精品导航| 久久久91精品国产一区二区三区| 欧美日韩视频第一区| 国产一区二区三区在线观看免费视频| 亚洲精品国偷自产在线99热| 欧美一区二区高清| 亚洲婷婷综合久久一本伊一区| 久久久噜噜噜| 国产精品久久二区二区| 亚洲国产成人不卡| 欧美亚洲综合在线| 在线视频你懂得一区| 毛片av中文字幕一区二区| 国产精品视频精品视频| 亚洲精品一级| 亚洲黄色在线观看| 久久精品在线| 欧美午夜一区| 亚洲精品美女在线观看| 亚洲国产精品va在线看黑人动漫| 午夜老司机精品| 欧美日韩免费一区二区三区视频| 精品99一区二区三区| 亚洲欧美日韩一区在线| 亚洲一区一卡| 欧美日韩高清免费| 曰韩精品一区二区| 久久精品人人做人人爽| 欧美一区二区三区免费观看| 欧美三级电影精品| 最近看过的日韩成人| 亚洲福利视频网站| 久久精品论坛| 国产麻豆午夜三级精品| 中文精品视频| 中日韩美女免费视频网址在线观看 | 男同欧美伦乱| 国内在线观看一区二区三区| 亚洲欧美日韩国产综合在线 | 亚洲欧美999| 亚洲一区二区三区精品在线观看 | 欧美日韩在线一二三| 亚洲欧洲另类国产综合| 亚洲欧洲另类| 老鸭窝毛片一区二区三区| 国产在线观看一区| 欧美一区二区在线看| 欧美一区视频| 国产伦精品一区二区三区在线观看 | 欧美激情在线免费观看| 在线视频国产日韩| 亚洲国产cao| 久久免费视频在线观看| 国产视频在线观看一区二区| 亚洲欧美一区二区激情| 午夜亚洲一区| 国产农村妇女精品| 欧美一区二区三区免费看| 久久久久久久波多野高潮日日| 国产日韩在线一区二区三区| 午夜精品视频一区| 久久手机精品视频| 尤物九九久久国产精品的分类| 亚洲丁香婷深爱综合| 老妇喷水一区二区三区| 亚洲成色777777在线观看影院| 亚洲电影第三页| 欧美大片免费| 亚洲免费高清| 亚洲欧美一区二区三区在线| 国产精品亚洲а∨天堂免在线| 午夜精品久久久久久久久久久| 久久国产精品毛片| 精品电影在线观看| 亚洲精品美女久久7777777| 欧美精品一卡| 亚洲精品欧美日韩| 亚洲欧美激情四射在线日| 国产欧美三级| 欧美制服丝袜| 欧美高清在线观看| 一区二区高清| 欧美在线观看视频在线| 在线不卡a资源高清| 一本色道久久综合狠狠躁篇的优点 | 欧美午夜激情小视频| 亚洲一区二区三区欧美| 久久精品欧美| 91久久国产精品91久久性色| 亚洲一区二区三区四区五区黄 | 久久国产66| 亚洲高清视频一区| 亚洲一区影院| 激情五月***国产精品| 9l视频自拍蝌蚪9l视频成人| 国产精品久久久久aaaa樱花| 欧美主播一区二区三区| 欧美猛交免费看| 亚洲欧美另类久久久精品2019| 久久视频在线视频| 99热精品在线| 久久青青草综合| 夜夜嗨av色一区二区不卡| 久久国产精品一区二区三区| 亚洲黄色有码视频| 午夜精品国产更新| 亚洲国产精品va| 欧美一区二区日韩一区二区| 亚洲高清在线| 欧美亚洲免费电影| 亚洲福利av| 欧美在线视频免费播放| 91久久综合| 久久精品伊人| 一区二区三区久久网| 久久嫩草精品久久久精品一| 99国产精品99久久久久久| 久久久伊人欧美| 日韩西西人体444www| 久久免费精品视频| 一区二区福利| 欧美福利影院| 欧美尤物巨大精品爽| 欧美日韩一区二区三区高清| 久久国产精品亚洲va麻豆| 欧美性猛交xxxx免费看久久久| 欧美专区亚洲专区| 国产精品乱码一区二三区小蝌蚪| 亚洲欧洲精品一区二区| 国产亚洲精品久久久久久| 亚洲一区二区三区在线视频| 亚洲国产精品www| 久久免费视频观看| 亚洲女性裸体视频| 欧美视频一区二区三区|