哎喲JAVA不錯哦
我們都知道jvm類加載使用的是雙親委派模型,那麼到底什麼是雙親委派模型?這樣做的好處又是什麼呢?又如何打破雙親委派模型呢?
先來了解下JVM中的類加載器:JVM類加載器大致可以分為以下幾種:
1,啟動類加載器:Bootstrap ClassLoader:負責加載jre\\lib下面的jar中的類進入內存,在HotSpot虛擬機中,是使用C++進行實現;
2,擴展類加載器:Extension ClassLoader:負責加載jre\\lib\\ext下面的擴展型jar中的類進行入內存;
3,系統類加載器:Application ClassLoader:負責加載應用中classpath目錄下面的所有jar。
4,自定義加載器:通過繼承ClassLoader,可實現自己的類加載器,通常可以用在熱部署,網絡輸入的流等類庫;
幾種類加載器的繼承關係如下:
雙親委派模型:一個類加載器收到類加載任務的時候,會先查看是不是已經被加載過,如果沒有加載過則委託給父加載器進行加載,父加載器經過同樣的過程,如果父加載器搜索不到這個類,則讓子加載器自己嘗試著加載,如果所有加載器都找不到,則拋出ClassNotFoundException異常;
一句話總結雙親委派模型的特點是:父親能幹的事就讓父親幹,幹不了再讓兒子來;
雙親委派模型好處:比如說,某“壞人”在將jre\\lib下面的包中的某個類(a.b.c)中,意圖植入大量的惡意代碼,但因為這個原本的類已經被Bootstrap ClassLoader加載過了,後面加入的a.b.c不會在加載進入內存中,雙親委派模型的類加載方式,就能防止惡意代碼的向頂層汙染;
打破雙親委派模型:要打破雙親委派模型的加載方式,首先需要集成ClassLoader,然後再重寫loadClass(),findClass(),因為雙親委派的代碼邏輯主要在loadClass方法中,重寫覆蓋loadClass方法,讓父類加載器加載失敗,這樣就可以交由自定義的類加載器加載了;
雙親委派模型就說這麼多,下次將會從ClassLoader類加載器的源碼角度,詳細分析下類加載器的加載過程,如果有需要的朋友,敬請關注。。