麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Java二進制兼容性原理

2019-11-18 14:24:12
字體:
來源:轉載
供稿:網友

  一、概述

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

  java二進制兼容性概念的主要目標是推動Internet上軟件的廣泛重用,同時它還避免了大多數C++環境面臨的基礎類脆弱性問題——例如,在C++中,對域(數據成員或實例變量)的訪問被編譯成相對于對象起始位置的偏移量,在編譯時就確定,假如類加入了新的域并重新編譯,偏移量隨之改變,原先編譯的使用老版本類的代碼就不能正常執行;虛擬方法調用也存在同樣的問題。

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

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

  首先來看一個簡單的例子。Authorization和Hello類分別來自兩個不同的作者,Authorization提供身份驗證和授權服務,Hello類要調用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("您未能通過身份驗證");
 }
}
  現在author1發布了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可以調用任意一個Authorization.class。

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

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

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

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

  ⑷ Java提供了更完善的錯誤控制機制,版本不兼容會觸發異常,但可以方便地捕捉和處理。相比之下,在C/C++中,共享庫版本不兼容往往引起嚴重問題。
  二、類和對象的兼容性

  二進制兼容的概念在某些方面與對象串行化的概念相似,兩者的目標也有一定的重疊。串行化一個Java對象時,類的名稱、域的名稱被寫入到一個二進制輸出流,串行化到磁盤的對象可以用類的不同版本來讀取,前提是該類要求的名稱、域都存在,且類型一致。下表比較了二進制兼容和串行化這兩個概念。

 
對象串行化
二進制兼容
適用于 對象類

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九九热视频免费 | 欧美一级免费看 | 康妮卡特欧美精品一区 | 91成人午夜性a一级毛片 | 国产羞羞视频在线观看 | 黄色毛片免费视频 | 国产99久久久久久免费看农村 | 国产精品久久久久久久久久东京 | 91短视频在线视频 | 精品xxxx户外露出视频 | 欧美成人精品 | 国产亚洲精品久久久久久久久久 | 91精品国产乱码久久久久久久久 | 少妇的肉体k8经典 | 国产91丝袜在线播放 | 国产精品久久久久久久久粉嫩 | 亚洲精品日韩色噜噜久久五月 | 国产午夜精品一区二区三区四区 | 久久综合福利 | 91短视频在线免费观看 | 中文字幕亚洲视频 | 凹凸成人精品亚洲精品密奴 | 免费一级片网站 | 久草视频福利在线观看 | h视频在线播放 | 亚洲国产精品久久久久久久久久 | 亚洲成人涩涩 | 国产一区二区不卡视频 | 27xxoo无遮挡动态视频 | 久久亚洲精品久久国产一区二区 | www日韩在线观看 | 日本中文字幕网址 | 欧美日本免费一区二区三区 | 国产精品久久久久久模特 | 亚洲精品成人在线视频 | 一区二区久久电影 | 一区二区免费看 | 国产91九色 | 午夜看毛片 | 九九热精品免费视频 | 黄色美女网站免费看 |