資源描述:
《【深入java虛擬機(4)】:類加載機制-編程開發(fā)技術》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、【深入Java虛擬機(4)】:類加載機制-編程開發(fā)技術【深入Java虛擬機(4)】:類加載機制原文出處:蘭亭風雨類加載過程???類從被加載到虛擬機內(nèi)存屮開始,到卸載出內(nèi)存為止,它的整個生命周期包抓加載、驗證、準備、解析、初始化、使用和卸載七個階段。它們開始的順序如下圖所示:解析卸載使用初始化其中類加載的過程包描了加載、驗證、準備、解析、初始化五個階段。在這五個階段屮,加載、驗證、準備和初始化這四個階段發(fā)生的順序是確定的,而解析階段則不一定,它在某些情況下可以在初始化階段之后開始,這是為了支持Java語言的運行時綁定(也成為動態(tài)綁定或晚期
2、綁定)。另外注意這里的幾個階段是按順序開始,I佃不是按順序進行或完成,因為這些階段通常都是互相交叉地混合進行的,通常在一個階段執(zhí)行的過程中調(diào)用或激活另一個階段。這里簡要說明下Java中的綁定:綁定指的是把一個方法的調(diào)用與方法所在的類(方法主體)關聯(lián)起來,對java來說,綁定分為靜態(tài)綁定和動態(tài)綁定:?靜態(tài)綁定:即詢期綁定。在程序執(zhí)行詢方法已經(jīng)被綁定,此吋山編譯器或其它連接程序?qū)崿F(xiàn)。針對java,簡單的可以理解為程序編譯期的綁定。java當中的方法只有final,static,private和構造方法是前期綁定的。?動態(tài)綁定:即晚期綁定,也
3、叫運行時綁定。在運行時根據(jù)具體對彖的類型進行綁定。在java屮,幾乎所有的方法都是后期綁定的。??下面詳細講述類加載過程中每個階段所做的工作。加載加載吋類加載過程的第一個階段,在加載階段,虛擬機需要完成以下三件事情:1、通過一個類的全限定名來獲取其定義的二進制字節(jié)流。2、將這個字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)結構。3、在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區(qū)中這些數(shù)據(jù)的訪問入口。注意,這里第1條中的二進制字節(jié)流并不只是單純地從Class文件中獲取,比如它還可以從Jar包屮獲取、
4、從網(wǎng)絡屮獲?。ㄗ畹湫偷膽帽闶茿pplet)、由其他文件生成(JSP應用)等。相對于類加載的其他階段而言,加載階段(準確地說,是加載階段獲取類的二進制字節(jié)流的動作)是可控性最強的階段,因為開發(fā)人員既可以使用系統(tǒng)提供的類加載器來完成加載,也可以自定義自己的類加載器來完成加載。加載階段完成后,虛擬機外部的二進制字節(jié)流就按照虛擬機所需的格式存儲在方法區(qū)之中,而口在Java堆中也創(chuàng)建一個java.lang.Class類的對彖,這樣便可以通過該對象訪問方法區(qū)111的這些數(shù)據(jù)。說到加載,不得不提到類加載器,下面就具體講述下類加載器。類加載器雖然只用
5、于實現(xiàn)類的加載動作,但它在Java程序小起到的作用卻遠遠不限于類的加載階段。對于任意一個類,都需要由它的類加載器和這個類本身一同確定其在就Java虛擬機中的唯一性,也就是說,即使兩個類來源于同一個Class文件,只耍加載它們的類加載器不同,那這兩個類就必定不相等。這里的"相等”包括了代表類的Class對象的equals()、isAssignab1eFrom()、islnstancc()等方法的返回結果,也包括了使用instanccof關鍵字對對彖所屬關系的判定結果。站在Java虛擬機的角度來講,只存在兩種不同的類加載器:?啟動類加載器:
6、它使用C++實現(xiàn)(這里僅限于Hotspot,也就是JDK1.5之后默認的虛擬機,有很多其他的虛擬機是用Java語言實現(xiàn)的),是虛擬機口身的一部分。?所有其他的類加載器:這些類加載器部由Java語言實現(xiàn),獨立于虛擬機之外,并且全部繼承白抽象類javaJang.ClassLoader,這些類加載器需要由啟動類加載器加載到內(nèi)存中Z后才能去加載其他的類。站在Java開發(fā)人員的角度來看,類加載器可以大致劃分為以下三類:?啟動類加載器:BootstrapClassLoader,跟上面相同。它負責加載存放在JDKjrelib(JDK代表JDK的安
7、裝目錄,下同)F,或fe-Xbootclasspath參數(shù)指定的路徑中的,并且能被虛擬機識別的類庫(如H.jar,所有的java.*開頭的類均被BootstrapClassLoader加載)。啟動類加載器是無法被Java程序直接引用的。?擴展類加載器:ExtensionClassLoadcr,該加載器由sun.misc.LaunchcrSExtClassL(^adcr實現(xiàn),它負責加載JDKjrelibextH錄中,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類庫(如javax.*開頭的類),開發(fā)者可以直接使用擴展類加
8、載器。?應用程序類加載器:ApplicationClassLoader,該類加載器由sun.misc.Launcher$AppClassLoader來實現(xiàn),它負責加載用八類路徑(ClassPalh)所指定的