Java二進制兼容性概述_第1頁
Java二進制兼容性概述_第2頁
Java二進制兼容性概述_第3頁
Java二進制兼容性概述_第4頁
Java二進制兼容性概述_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第第頁Java二進制兼容性概述Java二進制兼容性概述

發(fā)表于:2023-06-22來源::點擊數(shù):標簽:

現(xiàn)在的軟件越來越依賴于不同廠商、開發(fā)的共享組件,組件管理也變得越來越重要。在這方面,一個極其重要的問題是類的不同版本的二進制兼容性,即一個類改變時,新版的類是否可以直接替換原來的類,卻不至于損壞其他由不同廠商/開發(fā)的依賴于該類的

現(xiàn)在的軟件越來越依賴于不同廠商、開發(fā)的共享組件,組件管理也變得越來越重要。在這方面,一個極其重要的問題是類的不同版本的二進制兼容性,即一個類改變時,新版的類是否可以直接替換原來的類,卻不至于損壞其他由不同廠商/開發(fā)的依賴于該類的組件?

Java二進制兼容性概念的主要目標是推動Internet上軟件的廣泛重用,同時它還避免了大多數(shù)C++環(huán)境面臨的基礎(chǔ)類脆弱性問題——例如,在C++中,對域(數(shù)據(jù)成員或?qū)嵗兞浚┑脑L問被編譯成相對于對象起始位置的偏移量,在編譯時就確定,如果類加入了新的域并重新編譯,偏移量隨之改變,原先編譯的使用老版本類的代碼就不能正常執(zhí)行;虛擬方法調(diào)用也存在同樣的問題。

C++環(huán)境通常采用重新編譯所有引用了被修改類的代碼來解決問題。在Java中,少量開發(fā)環(huán)境也采用了同樣的策略,但這種策略存在諸多限制。例如,假設(shè)有人開發(fā)了一個程序P,P引用了一個外部的庫L1,但P的沒有L1的源代碼;L1要用到另一個庫L2?,F(xiàn)在L2改變了,但L1無法重新編譯,所以P的開發(fā)和更改也受到了限制。

為此,Java引入了二進制兼容的概念——如果對L2的更改是二進制兼容的,那么更改后的L2、原來的L1和現(xiàn)在的P能夠順利連接,不會出現(xiàn)任何錯誤。

首先來看一個簡單的例子。Authorization和Hello類分別來自兩個不同的,Authorization提供身份驗證和授權(quán)服務(wù),Hello類要調(diào)用Authorization類。

packagecom.author1;

publicclassAuthorization{

publicbooleanauthorized(StringuserName){

returntrue;

}

}

packagecom.author2;

importcom.author1.*;

classHello{

publicstaticvoidmain(Stringarg[]){

Authorizationauth=newAuthorization();

if(auth.authorized("MyName"))

System.out.println("您已經(jīng)通過驗證");

else

System.out.println("您未能通過身份驗證");

}

}

現(xiàn)在author1發(fā)布了Authorization類的2.0版,Hello類的author2希望在不更改原有Hello類的情況下使用新版的Authorization類。2.0版的Authorization要比原來的復(fù)雜不少:

packagecom.author1;

publicclassAuthorization{

publicTokenauthorized(StringuserName,Stringpwd){

returnnull;

}

privatebooleandetermineAuthorization(StringuserName,Stringpwd){

returntrue;

}

publicbooleanauthorized(StringuserName){

returntrue;

}

publicclassToken{}

}

author1承諾2.0版的Authorization類與1.0版的類二進制兼容,或者說,2.0版的Authorization類仍舊滿足1.0版的Authorization類與Hello類的約定。顯然,author2編譯Hello類時,無論使用Authorization類的哪一個版本都不會出錯——實際上,如果僅僅是因為Authorization類升級,Hello類根本無需重新編譯,同一個Hello.class可以調(diào)用任意一個Authorization.class。

這一特性并非Java獨有。UNIX系統(tǒng)很早就有了共享對象庫(.so文件)的概念,Windows系統(tǒng)也有動態(tài)鏈接庫(.dll文件)的概念,只要替換一下文件就可以將一個庫改換為另一個庫。就象Java的二進制兼容特性一樣,名稱的連接是在運行時完成,而不是在代碼的編譯、連接階段完成,而因它也同樣擁有Java二進制兼容性所具有的優(yōu)點,例如修改代碼時只需重新編譯一個庫,便于對程序的某一部分進行修改。但是,Java的二進制兼容性還有其獨特的優(yōu)勢:

⑴Java將二進制兼容性的粒度從整個庫(可能包含數(shù)十、數(shù)百個類)細化到了單個的類。

⑵在C/C++之類的語言中,創(chuàng)建共享庫通常是一種有意識的行為,一個應(yīng)用軟件一般不會提供很多共享庫,哪些代碼可以共享、哪些代碼不可共享都是預(yù)先規(guī)劃的結(jié)果。但在Java中,二進制兼容變成了一種與生俱來的天然特性。

⑶共享對象只針對函數(shù)名稱,但Java二進制兼容性考慮到了重載、函數(shù)簽名、返回值類型。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論