1妒潭、啟動(dòng)類加載器:Bootstrap ClassLoader :加載對(duì)象是java核心庫(kù)悴能,把一些核心的類加載進(jìn)jvm中,使用原生C/C++實(shí)現(xiàn)雳灾,所有類的加載器的父加載器漠酿。無(wú)法被java程序使用。
2谎亩、擴(kuò)展類加載器:Extension ClassLoader:加載對(duì)象為java擴(kuò)展庫(kù)炒嘲,由啟動(dòng)類加載器加載,getParent()返回null;
3团驱、應(yīng)用程序類加載器:Application ClassLoader:系統(tǒng)類加載器摸吠,加載用戶類路徑指定的類庫(kù),程序沒(méi)有自定義加載器嚎花,為默認(rèn)加載器寸痢。父類為擴(kuò)展類加載器;
雙親委托機(jī)制:
一個(gè)類加載進(jìn)來(lái)紊选,委托給父類加載器加載啼止,父類加載器又嘗試委托給其父類加載器,以此類推兵罢,直到父類加載器為啟動(dòng)類加載器献烦。父類加載器反饋無(wú)法加載時(shí),子加載器才會(huì)嘗試自己加載卖词。
優(yōu)點(diǎn):
1巩那、保證java應(yīng)用所使用的都是同一個(gè)版本java核心庫(kù)的類;
2此蜈、保證安全性即横,啟動(dòng)類加載器檢查緩存中已經(jīng)有加載的類,不會(huì)再次加載外部的類裆赵;
全盤(pán)負(fù)責(zé)機(jī)制:
一個(gè)類加載器加載一個(gè)類時(shí)东囚,如果沒(méi)有顯式指定類加載器,該類所依賴的战授、引用的其他所有類都由這個(gè)類加載器加載页藻;
jvm中桨嫁,同一個(gè)jvm中可以有兩個(gè)包名、類名都相同的類份帐,只要他們由兩個(gè)不同的類加載器加載璃吧。該特征提供了隔離機(jī)制,tomcat的hotswap機(jī)制废境;
報(bào)錯(cuò)ClassNotFoundException
原因:類加載器加載引用類時(shí)肚逸,只會(huì)向上查找引用類,而不會(huì)從子類加載器上查找彬坏;
解決方式:
1朦促、用同一個(gè)類加載器;
2栓始、a务冕,b兩個(gè)類,b類引用a類幻赚,a類加載器大于b類的加載器禀忆;