1朦促、什么是類的加載
????????類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)栓始,然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象务冕,用來(lái)封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類的加載的最終產(chǎn)品是位于堆區(qū)中的Class對(duì)象幻赚,Class對(duì)象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)禀忆,并且向Java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口臊旭。
????????類加載器并不需要等到某個(gè)類被“首次主動(dòng)使用”時(shí)再加載它,JVM規(guī)范允許類加載器在預(yù)料某個(gè)類將要被使用時(shí)就預(yù)先加載它箩退,如果在預(yù)先加載的過程中遇到了.class文件缺失或存在錯(cuò)誤离熏,類加載器必須在程序首次主動(dòng)使用該類時(shí)才報(bào)告錯(cuò)誤(LinkageError錯(cuò)誤)如果這個(gè)類一直沒有被程序主動(dòng)使用,那么類加載器就不會(huì)報(bào)告錯(cuò)誤.
????????加載.class文件的方式:
????????????– 從本地系統(tǒng)中直接加載
????????????– 通過網(wǎng)絡(luò)下載.class文件
????????????– 從zip戴涝,jar等歸檔文件中加載.class文件
????????????– 從專有數(shù)據(jù)庫(kù)中提取.class文件
????????????– 將Java源文件動(dòng)態(tài)編譯為.class文件
2滋戳、類的生命周期
????????其中類加載的過程包括了加載、驗(yàn)證啥刻、準(zhǔn)備奸鸯、解析、初始化五個(gè)階段可帽。在這五個(gè)階段中娄涩,加載、驗(yàn)證映跟、準(zhǔn)備和初始化這四個(gè)階段發(fā)生的順序是確定的蓄拣,而解析階段則不一定,它在某些情況下可以在初始化階段之后開始申窘,這是為了支持Java語(yǔ)言的運(yùn)行時(shí)綁定(也稱為動(dòng)態(tài)綁定或晚期綁定)弯蚜。另外注意這里的幾個(gè)階段是按順序開始,而不是按順序進(jìn)行或完成剃法,因?yàn)檫@些階段通常都是互相交叉地混合進(jìn)行的,通常在一個(gè)階段執(zhí)行的過程中調(diào)用或激活另一個(gè)階段路鹰。
?????????加載:查找并加載類的二進(jìn)制數(shù)據(jù)贷洲。
????????加載時(shí)類加載過程的第一個(gè)階段,在加載階段晋柱,虛擬機(jī)需要完成以下三件事情:
????????????1优构、通過一個(gè)類的全限定名來(lái)獲取其定義的二進(jìn)制字節(jié)流。
????????????2雁竞、將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)钦椭。
????????????3、在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象碑诉,作為對(duì)方法區(qū)中這些數(shù)據(jù)的訪問入口彪腔。
????????相對(duì)于類加載的其他階段而言,加載階段(準(zhǔn)確地說(shuō)进栽,是加載階段獲取類的二進(jìn)制字節(jié)流的動(dòng)作)是可控性最強(qiáng)的階段德挣,因?yàn)殚_發(fā)人員既可以使用系統(tǒng)提供的類加載器來(lái)完成加載,也可以自定義自己的類加載器來(lái)完成加載快毛。)
????????加載階段完成后格嗅,虛擬機(jī)外部的二.進(jìn)制字節(jié)流就按照虛擬機(jī)所需的格式存儲(chǔ)在方法區(qū)之中番挺,而且在Java堆中也創(chuàng)建一個(gè)java.lang.Class類的對(duì)象,這樣便可以通過該對(duì)象訪問方法區(qū)中的這些數(shù)據(jù)屯掖。