国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在Java中用類裝載框架控制類加載

2019-11-18 10:41:39
字體:
供稿:網(wǎng)友
摘要 通過構(gòu)建一個能夠把java類裝載隔離到一個指定的jar文件中的類裝載組件容器框架,你可以確保運(yùn)行時刻會裝載你期望的組件版本。

  Java的類裝載框架強(qiáng)有力且具有靈活性。它答應(yīng)應(yīng)用程序存取類庫而不必鏈接到靜態(tài)的"include"文件。代之的是,它能夠從指定位置裝載包含庫類和資源的檔案文件,例如由CLASSPATH環(huán)境變量所定義的目錄和網(wǎng)絡(luò)位置。由系統(tǒng)來動態(tài)地解析對類和資源的運(yùn)行時刻參考,從而簡化了更新和版本發(fā)行。然而,每一個庫都有其自己的依靠性集合-并且由開發(fā)者和發(fā)布人員來保證他們的應(yīng)用程序適當(dāng)?shù)貐⒖颊_的版本。遺憾的是,默認(rèn)的類裝載系統(tǒng)和特定依靠性的結(jié)合可能并且確實(shí)會導(dǎo)致錯誤、系統(tǒng)崩潰甚至于更糟糕的情況發(fā)生。

  本文中,我將向你建議一個實(shí)現(xiàn)類裝載的容器框架,從而解決這些問題。

  一、 Java Classpath

  Java根據(jù)環(huán)境屬性/變量CLASSPATH來指定運(yùn)行時刻用來查找類和其它資源的路徑。你可以通過設(shè)置CLASSPATH環(huán)境變量或使用Java命令行選項(xiàng)--classpath來定義CLASSPATH屬性。

  典型地,一個Java運(yùn)行時刻以下面順序查找和加載類:

  1. 在bootstrap類列表中的類-這些是體現(xiàn)Java平臺的類,例如在rt.jar中的類。

  2. 出現(xiàn)在擴(kuò)展類列表中的類-這些類使用擴(kuò)展機(jī)制框架來擴(kuò)展Java平臺,使用位于運(yùn)行時刻環(huán)境的/lib/ext目錄下的檔案文件(.jar,.zip,等等。)。

  3. 用戶類-這些類不使用-classpath命令行選項(xiàng)或CLASSPATH環(huán)境變量標(biāo)識的擴(kuò)展機(jī)制架構(gòu)。

  二、 檔案與Classpath

  一個檔案.jar或.zip文件可以包括一個manifest文件-它們包含能夠用于提供檔案信息,設(shè)置檔案屬性,等等的入口。這個manifest文件還可以通過包括一個名為Class-Path的入口(它包含一個檔案和目錄列表)來擴(kuò)展classpath。JDK 1.3中引入了Class-Path manifest入口用于指定可選的據(jù)需要可以加載的jar文件和目錄。下面是一個Class-Path入口的例子:

Class-Path: mystuff/utils.jar
mystuff/logging.jar mylib/

  Java提供了一種可擴(kuò)展模型用于指定裝載類的位置和文件列表。然而,由此也引發(fā)了一些問題,例如,一個不同版本的庫可能存在于classpath中-這超出一個執(zhí)行類所期望的結(jié)果。

  三、 Classpath版本沖突

  在Java中,一個類的運(yùn)行時刻標(biāo)識是由通過其完全限定名字來定義的(在類名之前的包名,有時被作為FQN),所有這些都添加到裝載類的相關(guān)裝載器的ID。這樣以來,由多個類加載器加載的一個類的每一個實(shí)例都將被當(dāng)作是Java運(yùn)行時刻的一個單獨(dú)的實(shí)體。這意味著,運(yùn)行時刻能夠在任何時間裝載同一個類的多個版本。這是一種非常有力和相當(dāng)靈活的特征;然而,假如一位開發(fā)人員不認(rèn)真地使用的話,某些副作用可能會令他迷惑不解。

  可以設(shè)想,你在開發(fā)一個企業(yè)應(yīng)用程序-它使用類似語義從多種源存取數(shù)據(jù),例如一個文件系統(tǒng)和一個數(shù)據(jù)庫。許多這種類型的系統(tǒng)都暴露一個數(shù)據(jù)存取層-通過抽象類似數(shù)據(jù)源的數(shù)據(jù)存取對象(DAO)。現(xiàn)在,設(shè)想你裝載一個新版本的一個數(shù)據(jù)庫DAO,使用一種略微不同的API來滿足一個DAO客戶端的新特征的要求-但是你仍然需要舊式的DAO以便適合于其它還沒有為這種新的API預(yù)備好的客戶端。在典型的運(yùn)行時刻環(huán)境下,這種新的DAO將簡單地替換舊的版本并且所有的新實(shí)例都將從新版本中創(chuàng)建。然而,假如在不停止運(yùn)行時刻環(huán)境的前提下發(fā)生更新,那么任何已經(jīng)存在的舊DAO的實(shí)例將與該新DAO的任何實(shí)例一起駐留于內(nèi)存中-當(dāng)創(chuàng)建這些新實(shí)例時。這已經(jīng)足已令人迷惑了。更為糟糕的是,一位DAO客戶期望創(chuàng)建一個舊版本的DAO的實(shí)例,但是實(shí)際上得到一個具有已改變的API的新版本的實(shí)例。正如你所見,這可能會帶來一些有趣的挑戰(zhàn)。

  為了確保穩(wěn)定性和安全性,調(diào)用代碼必須能夠指明它想使用的類的正確版本。為此,你可以創(chuàng)建一個類加載器,組件容器模型并且使用一些簡單的類加載技術(shù)。

  四、 檔案與組件

  因?yàn)闄n案文件(jar文件,zip文件,等等)與Java類加載機(jī)制和發(fā)布工具之間具有相當(dāng)松的耦合性,所以它們是一種用作自定義組件容器的自然的候選。一個Java組件在一個檔案文件中的打包與發(fā)布的成功依靠于:

  · 能夠指定要實(shí)例化一個組件的哪個版本的開發(fā)者

  · 裝載組件的輔助類的正確版本-根據(jù)與該組件在同一個jar文件中發(fā)現(xiàn)的信息。

  這使得組件的開發(fā)者和消費(fèi)者能夠完全控制實(shí)際創(chuàng)建和使用每一個組件的相應(yīng)版本。

  在下面的幾節(jié)中,我將討論一下有關(guān)于定義組件和組件命名空間的概念。

  五、 共享輔助資源

  最大的問題之一是,當(dāng)使用標(biāo)準(zhǔn)類加載器在Java中處理共享庫時,所有的類都被加載到一個命名空間中。這使得在任何給定時刻很難使用相同庫的不同版本。你所需要的是,一個組件能夠定義它自己的命名空間-該組件及其所有輔助庫將會裝載到其中的。

  因?yàn)樵贘ava中,一個類的運(yùn)行時刻標(biāo)識是使用類的完全限定名和其加載器的ID來定義的,所以一個命名空間已經(jīng)相應(yīng)于每一個類加載器存在。因此,你可以使用類加載器來構(gòu)建一個組件容器,由它來定義一個組件及其依靠對象的一個命名空間。

  例如,假如我有一個命名為"com.jeffhanson.components.HelloWorld"的類,我想運(yùn)行它的兩個版本,那么解決方案是,使用一個類裝載器創(chuàng)建HelloWorld類的一個版本的一個實(shí)例,而使用另一個類裝載器創(chuàng)建另一個版本的HelloWorld類。圖1展示了這一概念。

在Java中用類裝載框架控制類加載(圖一)
圖1.使用多個類裝載器:由于Java命名慣例特征的影響,使用不同的類裝載器將定義不同的命名空間。

  正如我將在本文中所要展示的,使用兩個不同的類裝載器來實(shí)例化一個類的技術(shù)實(shí)際上創(chuàng)建了一個虛擬的命名空間。然而,我實(shí)際上剛好創(chuàng)建了同一個版本的類的多個實(shí)例。

  為了便于加載和實(shí)例化同一個類的多個版本,我將展示(在下面的幾節(jié)中)一個組件-容器框架-它基于類裝載器命名空間機(jī)制以答應(yīng)裝載同一個類的不同版本。六、 利用Classloader命名空間

  你可以把組件容器框架實(shí)現(xiàn)為一個容器實(shí)體-負(fù)責(zé)加載在jar或zip檔案中定義的組件以及該組件需要的輔助類。這個框架的創(chuàng)建目標(biāo)是:

  1. 答應(yīng)開發(fā)者指定實(shí)例化一個組件的哪個版本。

  2. 基于與組件在同一個jar文件中找到的信息為每個組件裝載正確的輔助類。

  3. 跨組件共享輔助類和檔案。

  你將需要一個配置文件來定義組件及其相應(yīng)的輔助文件,正如下列示例所展示的:



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 扎囊县| 全椒县| 六盘水市| 政和县| 长子县| 白玉县| 仲巴县| 唐海县| 康马县| 赣榆县| 博乐市| 丘北县| 获嘉县| 泗水县| 宁明县| 凤山市| 阳东县| 贵德县| 清水县| 庆安县| 当涂县| 汪清县| 突泉县| 瓦房店市| 石楼县| 喜德县| 乐业县| 定日县| 聂荣县| 霞浦县| 怀化市| 铜陵市| 淳安县| 靖西县| 上林县| 镇巴县| 格尔木市| 沅江市| 珠海市| 东乌珠穆沁旗| 大同县|