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

首頁 > 學院 > 開發(fā)設計 > 正文

Java二進制兼容性概述

2019-11-18 13:20:04
字體:
供稿:網(wǎng)友

  現(xiàn)在的軟件越來越依靠于不同廠商、作者開發(fā)的共享組件,組件治理也變得越來越重要。在這方面,一個極其重要的問題是類的不同版本的二進制兼容性,即一個類改變時,新版的類是否可以直接替換原來的類,卻不至于損壞其他由不同廠商/作者開發(fā)的依靠于該類的組件?
  
  java二進制兼容性概念的主要目標是推動Internet上軟件的廣泛重用,同時它還避免了大多數(shù)C++環(huán)境面臨的基礎類脆弱性問題——例如,在C++中,對域(數(shù)據(jù)成員或?qū)嵗兞浚┑脑L問被編譯成相對于對象起始位置的偏移量,在編譯時就確定,假如類加入了新的域并重新編譯,偏移量隨之改變,原先編譯的使用老版本類的代碼就不能正常執(zhí)行;虛擬方法調(diào)用也存在同樣的問題。
  
  C++環(huán)境通常采用重新編譯所有引用了被修改類的代碼來解決問題。在Java中,少量開發(fā)環(huán)境也采用了同樣的策略,但這種策略存在諸多限制。例如,假設有人開發(fā)了一個程序P,P引用了一個外部的庫L1,但P的作者沒有L1的源代碼;L1要用到另一個庫L2。現(xiàn)在L2改變了,但L1無法重新編譯,所以P的開發(fā)和更改也受到了限制。
  
  為此,Java引入了二進制兼容的概念——假如對L2的更改是二進制兼容的,那么更改后的L2、原來的L1和現(xiàn)在的P能夠順利連接,不會出現(xiàn)任何錯誤。
  
  首先來看一個簡單的例子。Authorization和Hello類分別來自兩個不同的作者,Authorization提供身份驗證和授權服務,Hello類要調(diào)用Authorization類。
  
  package com.author1;
  public class Authorization {
   public boolean authorized(String userName) {
    return true;
   }
  }
  package com.author2;
  import com.author1.*;
  class Hello {
   public static void main(String arg[]) {
    Authorization auth = new Authorization();
    if(auth.authorized("MyName"))
     System.out.    else
     System.out.println("您未能通過身份驗證");
   }
  }
  
  現(xiàn)在author1發(fā)布了Authorization類的2.0版,Hello類的作者author2希望在不更改原有Hello類的情況下使用新版的Authorization類。2.0版的Authorization要比原來的復雜不少:
  
  package com.author1;
  public class Authorization {
   public Token authorized(String userName, String pwd) {
    return null;
   }
   private boolean determineAuthorization(String userName, String pwd) {
    return true;
   }
   public boolean authorized(String userName) {
    return true;
   }
   public class Token { }
  }
  
  作者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)建共享庫通常是一種有意識的行為,一個應用軟件一般不會提供很多共享庫,哪些代碼可以共享、哪些代碼不可共享都是預先規(guī)劃的結(jié)果。但在Java中,二進制兼容變成了一種與生俱來的天然特性。
  
  ⑶ 共享對象只針對函數(shù)名稱,但Java二進制兼容性考慮到了重載、函數(shù)簽名、返回值類型。
  
  ⑷ Java提供了更完善的錯誤控制機制,版本不兼容會觸發(fā)異常,但可以方便地捕捉和處理。相比之下,在C/C++中,共享庫版本不兼容往往引起嚴重問題。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 平武县| 佛冈县| 奈曼旗| 大兴区| 赤水市| 蓝田县| 承德市| 巴彦县| 江口县| 开阳县| 罗城| 潍坊市| 奎屯市| 莎车县| 平利县| 西藏| 射洪县| 敖汉旗| 伊川县| 日土县| 繁峙县| 雷州市| 宝清县| 庆云县| 丹凤县| 赤水市| 贵州省| 绥阳县| 禹州市| 丹江口市| 五台县| 台南县| 吴忠市| 张掖市| 湘乡市| 三穗县| 三穗县| 谷城县| 万宁市| 阿图什市| 咸丰县|