Java有三種類加載器,分別是啟動(dòng)類加載器(Bootstrap ClassLoader)、擴(kuò)展類加載器(Extension ClassLoader)和應(yīng)用程序類加載器(Application ClassLoader)。
啟動(dòng)類加載器(Bootstrap ClassLoader):負(fù)責(zé)加載Java的核心類庫(kù),例如Java API中的rt.jar和resources.jar等。它是JVM內(nèi)置的類加載器,通常由JVM的實(shí)現(xiàn)提供。
擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載Java擴(kuò)展類庫(kù),例如Java API中的ext目錄中的jar包。它是由JVM的實(shí)現(xiàn)提供的類加載器,通常是在啟動(dòng)類加載器之后加載的。
應(yīng)用程序類加載器(Application ClassLoader):負(fù)責(zé)加載應(yīng)用程序中的類,例如Java應(yīng)用程序中的jar包。它是由Java開(kāi)發(fā)者自己提供的類加載器,通常是在擴(kuò)展類加載器之后加載的。
類加載器的工作原理如下:
類加載器首先從文件系統(tǒng)、網(wǎng)絡(luò)等地方獲取類文件的字節(jié)碼。
類加載器將獲取到的字節(jié)碼加載到JVM的內(nèi)存中,并將其轉(zhuǎn)換成運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)(例如Java類)。
類加載器為加載的類分配一個(gè)唯一的標(biāo)識(shí)符,并將其保存在運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)中,以便后續(xù)的訪問(wèn)。
類加載器將加載的類的依賴類遞歸加載,并通過(guò)Java虛擬機(jī)的鏈接階段來(lái)解析它們之間的關(guān)系。
最后,類加載器將運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)中的類提交給Java虛擬機(jī)執(zhí)行。
總的來(lái)說(shuō),類加載器的工作是將類文件加載到JVM內(nèi)存中,并將其轉(zhuǎn)換為可執(zhí)行的Java類。通過(guò)使用不同的類加載器,Java程序可以實(shí)現(xiàn)動(dòng)態(tài)加載類、版本控制、代碼隔離等功能。