成都創(chuàng)新互聯(lián)公司專注于芒市網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供芒市營(yíng)銷型網(wǎng)站建設(shè),芒市網(wǎng)站制作、芒市網(wǎng)頁(yè)設(shè)計(jì)、芒市網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造芒市網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供芒市網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
前面的動(dòng)態(tài)代理學(xué)完了,以后在學(xué)習(xí)Spring的時(shí)候會(huì)用到這些動(dòng)態(tài)代理的知識(shí)和原理,像目標(biāo)對(duì)象,增強(qiáng)這兩個(gè)術(shù)語(yǔ),會(huì)經(jīng)常聽到。學(xué)習(xí)動(dòng)態(tài)代理,就是學(xué)習(xí)JDK中反射包下的一個(gè)Proxy類,具體來(lái)說(shuō),我們只是學(xué)習(xí)newProxyInstance(ClassLoader, interfaces, hander)這個(gè)方法。這篇開始來(lái)學(xué)習(xí)下,加載器,我們?cè)趯W(xué)習(xí)獲取動(dòng)態(tài)代理,第一個(gè)要準(zhǔn)備的參數(shù)就是,類加載器,通過(guò)這篇的學(xué)習(xí),稍微對(duì)類加載器有入門的了解。
來(lái)源:凱哥Java(kaigejava)
什么是類加載器(作用)
就是把計(jì)算機(jī)本地磁盤上的.class文件加載進(jìn)JVM內(nèi)存中方法區(qū),變成Class對(duì)象,實(shí)現(xiàn)這個(gè)過(guò)程的對(duì)象就是類加載器,這個(gè)類加載器本身也是一個(gè)類。
如何得到類加載器
前面我們學(xué)習(xí)動(dòng)態(tài)代理的時(shí)候,是通過(guò)當(dāng)前類來(lái)獲取類加載器,就是下面這行代碼。
ClassLoader?loader?=?this.getClass().getClassLoader();
這個(gè)getClassLoader()方法是在Class類中定義的方法。
類加載器的分類
類加載器有三個(gè)分類,以下三類分工明確,負(fù)責(zé)不同的類加載。
引導(dǎo)類加載器
這個(gè)分類主要是類庫(kù)加載,例如jre下面的lib文件夾中的rt.jar中類加載進(jìn)JVM內(nèi)存。
擴(kuò)展類加載器
這部分就是把擴(kuò)展的類庫(kù)加載到內(nèi)存,例如jre下面的ext文件夾下的全部文件,ext就是英文擴(kuò)展單詞的前綴縮寫。
系統(tǒng)類加載器
這分類就是加載一些應(yīng)用下的類,例如我們寫一個(gè)web項(xiàng)目,我們使用到很多其他第三方的jar包,這些類就是系統(tǒng)類加載器來(lái)完成加載。還有我們自己寫的代碼文件,也是系統(tǒng)類加載器完成這操作。
這三個(gè)分類的關(guān)系是,系統(tǒng)類加載器的上層是擴(kuò)展類加載器,擴(kuò)展類加載器的上層是引導(dǎo)類加載器,引導(dǎo)類加載器是老大,沒(méi)有上層。
類加載器的委托機(jī)制
由于上面三個(gè)類加載器分類的關(guān)系,產(chǎn)生了一個(gè)概念,叫類加載器的委托機(jī)制。先來(lái)看看下面這個(gè)過(guò)程,然后解釋什么是委托機(jī)制。
一開始,我們?cè)诖a中寫這行代碼new A(); 由于A類可能是JDK自帶,也可能是程序員自己寫的,這個(gè)類在加載進(jìn)內(nèi)存需要經(jīng)歷下面這個(gè)過(guò)程。
1)?系統(tǒng)類加載器發(fā)現(xiàn)自己要加載A類,因?yàn)檫@是在應(yīng)用下的代碼,理應(yīng)系統(tǒng)類加載器去處理加載。
2)?系統(tǒng)類加載器,根本不看這個(gè)A類是不是在自己管轄范圍,直接通知擴(kuò)展類加載器,想讓擴(kuò)展加載器去加載A類。
3)?擴(kuò)展加載類也不管,直接通知引導(dǎo)加載類,想讓引導(dǎo)加載類去執(zhí)行加載。
4)?引導(dǎo)加載類發(fā)現(xiàn)這個(gè)A類是rt.jar中的類,然后就加載到JVM內(nèi)存的方法區(qū),把這個(gè)Class對(duì)象返回給了擴(kuò)展,然后擴(kuò)展把這個(gè)對(duì)象Class對(duì)象返回給系統(tǒng)加載類,加載過(guò)程結(jié)束。
5)?如果引導(dǎo)加載器發(fā)現(xiàn)A類不是自己管轄范圍,返回null給擴(kuò)展。
6)?擴(kuò)展類加載器發(fā)現(xiàn)上層返回null, 只好擴(kuò)展去自己管轄范圍查找,查找到了,就加載進(jìn)入內(nèi)存,返回對(duì)應(yīng)class對(duì)象給系統(tǒng)加載器,加載過(guò)程結(jié)束。
7)?如果擴(kuò)展器沒(méi)有找到A類,就返回null給系統(tǒng)類加載器。
8)?系統(tǒng)類加載器發(fā)現(xiàn)上層返回null,只好去自己管轄范圍查找A類,找到了就加載進(jìn)JVM內(nèi)存,返回class對(duì)象,加載過(guò)程結(jié)束。
9)?如果系統(tǒng)類也找不到這個(gè)A類,拋出異常,ClassNotFoundException
這個(gè)過(guò)程就是委托機(jī)制,所有加載任務(wù)都優(yōu)先交給自己的上層去完成,上層完成不了然后才自己處理,這樣就包裝了類加載的安全,不會(huì)同時(shí)存在,三個(gè)類型加載器同時(shí)加載一個(gè)類的情況。
在實(shí)際的類解析過(guò)程中,類的加載還是要看線程,每一個(gè)線程就有自己的類加載器。所以本篇的類加載器的基礎(chǔ),有助于我們以后學(xué)習(xí)多線程并發(fā)和JVM這塊的知識(shí)點(diǎn)。
l聯(lián)系凱哥:凱哥Java(kaigejava)或凱哥個(gè)人博客:www.kaigejava.com(凱哥個(gè)人博客可以發(fā)即時(shí)消息給凱哥哦~)
Tomcat中的類加載器
簡(jiǎn)單來(lái)了解下Tomcat中的類加載器,在Tomcat中有兩種類加載器。
1)?服務(wù)器類加載器,負(fù)責(zé)加載tomcat下${CATALINA_HOME}\lib下的類,也就是tomcat安裝目錄下lib文件夾中的類。
2)?應(yīng)用類加載器,這個(gè)主要加載當(dāng)前web項(xiàng)目下\WEB-INF\lib?和\WEB-INF\classes,?就是我們程序員代碼編譯之后文件在\WEB-INF\classes,一些第三方j(luò)ar包在\WEB-INF\lib。
說(shuō)一下這種類加載器和前面知道的三個(gè)類加載器的區(qū)別和關(guān)系。在Tomcat下兩種類加載器都排下上面系統(tǒng)類加載器的下面,這兩個(gè)的上層都是系統(tǒng)類加載器。在Tomcat中的兩種類加載器有一個(gè)共同特性:先自己動(dòng)手,然后去委托。通過(guò)前面的委托機(jī)制的學(xué)習(xí),應(yīng)該知道這句話的含義。Tomcat中兩種類加載器會(huì)自己一開始就去自己管轄范圍查找和加載類,如果沒(méi)有找到才去委托給系統(tǒng)類加載器。