百度安裝app東莞seo排名公司
一、目標(biāo)
類(lèi)加載器(ClassLoader)是Java虛擬機(jī)(JVM)的一部分,用于加載Java類(lèi)文件到內(nèi)存中,并生成對(duì)應(yīng)的Class對(duì)象。類(lèi)加載器負(fù)責(zé)在運(yùn)行時(shí)查找和加載類(lèi)文件,為Java程序提供動(dòng)態(tài)加載和運(yùn)行時(shí)擴(kuò)展的功能。
二、類(lèi)型
2.1、啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader)
也稱(chēng)為根加載器,它是JVM內(nèi)嵌的加載器,負(fù)責(zé)加載Java核心類(lèi)庫(kù)(如java.lang包中的類(lèi))和其他需要在JVM啟動(dòng)時(shí)就被加載的類(lèi)。它是所有其他類(lèi)加載器的父加載器。由于是用C++實(shí)現(xiàn)的,因此在Java代碼中無(wú)法直接獲取到啟動(dòng)類(lèi)加載器的引用。
2.2、擴(kuò)展類(lèi)加載器(Extension ClassLoader):
它是由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)的,負(fù)責(zé)加載Java的擴(kuò)展類(lèi)庫(kù)(如javax包中的類(lèi))。它是由啟動(dòng)類(lèi)加載器加載的,并且是應(yīng)用類(lèi)加載器的父加載器。
2.3、應(yīng)用類(lèi)加載器(Application ClassLoader)
也稱(chēng)為系統(tǒng)類(lèi)加載器,它是由sun.misc.Launcher$AppClassLoader實(shí)現(xiàn)的,負(fù)責(zé)加載應(yīng)用程序的類(lèi)。應(yīng)用類(lèi)加載器是用戶(hù)自定義的類(lèi)加載器的默認(rèn)父加載器。
三、加載策略
3.1、問(wèn)題
解決類(lèi)的加載順序、一致性、可靠性、唯一性等;
3.2、雙親委派機(jī)制
雙親委派機(jī)制(Delegation Model)是Java類(lèi)加載器的一種加載策略,它定義了類(lèi)加載器在加載類(lèi)時(shí)的行為和優(yōu)先級(jí)。
雙親委派機(jī)制的基本思想是:當(dāng)一個(gè)類(lèi)加載器需要加載一個(gè)類(lèi)時(shí),它首先將加載請(qǐng)求委派給父類(lèi)加載器,只有當(dāng)父類(lèi)加載器無(wú)法加載該類(lèi)時(shí),才由自身加載器進(jìn)行加載。這個(gè)過(guò)程會(huì)一直循環(huán),直到頂層的啟動(dòng)類(lèi)加載器。如果所有的父類(lèi)加載器都無(wú)法加載該類(lèi),最終由子類(lèi)加載器加載。
3.3、優(yōu)勢(shì)
1、避免類(lèi)的重復(fù)加載:每個(gè)類(lèi)加載器都有自己的命名空間,當(dāng)父類(lèi)加載器已經(jīng)加載了一個(gè)類(lèi),子類(lèi)加載器無(wú)需重新加載,直接使用父類(lèi)加載器加載的類(lèi),避免了重復(fù)加載。
2、提供類(lèi)加載的安全性和一致性:通過(guò)雙親委派機(jī)制,類(lèi)加載器會(huì)沿著加載鏈向上委派加載請(qǐng)求,保證了加載的類(lèi)來(lái)自于同一個(gè)源,確保了類(lèi)的安全性和一致性。
3、確保核心類(lèi)的一致性:由啟動(dòng)類(lèi)加載器加載的核心類(lèi)庫(kù)是Java虛擬機(jī)的一部分,能夠保證在不同的Java應(yīng)用中,加載的核心類(lèi)庫(kù)是一致的。
需要注意的是,雙親委派機(jī)制并不是強(qiáng)制性的,可以通過(guò)自定義類(lèi)加載器繞過(guò)雙親委派機(jī)制,實(shí)現(xiàn)特定的加載邏輯,例如熱部署等需求。
雙親委派機(jī)制在Java中的應(yīng)用非常廣泛,不僅用于加載Java核心類(lèi)庫(kù),還用于加載應(yīng)用程序的類(lèi)。它確保了類(lèi)的加載按照優(yōu)先級(jí)和一致性進(jìn)行,提供了類(lèi)加載的可靠性和安全性。