類(lèi)加載簡(jiǎn)單說(shuō)就是將編寫(xiě)的類(lèi)加載到j(luò)vm中科雳,主要分為五個(gè)過(guò)程:
1.加載
將.class文件以二進(jìn)制的方式加載到內(nèi)存中秃踩,并且聲稱(chēng)一個(gè)class對(duì)象衷快,提供訪問(wèn)類(lèi)數(shù)據(jù)的接口尤揣。
2.驗(yàn)證
就是判斷類(lèi)的二進(jìn)制流是不是符合虛擬機(jī)的格式搔啊。
3.準(zhǔn)備
給類(lèi)變量設(shè)置初始值,并且分配內(nèi)存北戏。
4.解析
將常量池中的符號(hào)引用變成直接引用负芋。
5.初始化
給靜態(tài)變量賦值,執(zhí)行靜態(tài)代碼塊嗜愈。
雙親委派機(jī)制:
類(lèi)加載有雙親加載旧蛾,簡(jiǎn)單說(shuō)就是每單需要加載類(lèi)時(shí),子加載器都會(huì)讓父類(lèi)先加載蠕嫁,最終由最高層級(jí)的啟動(dòng)類(lèi)加載器來(lái)加載锨天,當(dāng)父加載器找不到類(lèi)時(shí),才會(huì)拋給子類(lèi)剃毒,這個(gè)是防止出現(xiàn)加載混亂病袄,因?yàn)楫?dāng)自己編寫(xiě)一個(gè)跟系統(tǒng)一樣的類(lèi)的時(shí)候,父類(lèi)默認(rèn)會(huì)用系統(tǒng)的赘阀,而不至于出現(xiàn)不知道加載那一個(gè)的情況益缠。
當(dāng)然,這種模式也可以打破基公,要打破這種模式幅慌,需要自定義類(lèi)加載器,并重寫(xiě)findclass和loadclass方法轰豆,這里最重要的是findclass方法胰伍,因?yàn)槟J(rèn)都是交個(gè)父類(lèi)執(zhí)行,這里重寫(xiě)成由當(dāng)前類(lèi)來(lái)找酸休。關(guān)于為什么要打破這種機(jī)制喇辽,是因?yàn)槟J(rèn)走父類(lèi)的邏輯,但是有些類(lèi)是要用三方廠商雨席,此時(shí)就需要打破這種機(jī)制菩咨。