随笔18 java中的类加载器
類的加載是由類加載器完成的,類加載器包括:根加載器(?BootStrap?)、擴(kuò)展加載器(?Extension?)、系統(tǒng)加載器(?System?)和用戶自定義類加載器(?java.lang.ClassLoader?的子類)。從?Java 2?(?JDK 1.2?)開始,類加載過程采取了父親委托機(jī)制(PDM?)。?PDM?更好的保證了?Java?平臺(tái)的安全性,在該機(jī)制中,?JVM?自帶的?Bootstrap?是根加載器,其他的加載器都有且僅有一個(gè)父類加載器。類的加載首先請(qǐng)求父類加載器加載,父類加載器無能為力時(shí)才由其子類加載器自行加載。?JVM?不會(huì)向?Java?程序提供對(duì)?Bootstrap?的引用。
1)Bootstrap ClassLoader 負(fù)責(zé)加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實(shí)現(xiàn),不是ClassLoader子類 2)Extension ClassLoader 負(fù)責(zé)加載java平臺(tái)中擴(kuò)展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包 3)App ClassLoader 負(fù)責(zé)記載classpath中指定的jar包及目錄中class 4)Custom ClassLoader 屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader,如tomcat、jboss都會(huì)根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader 加載過程中會(huì)先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個(gè)classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。 比較兩個(gè)類是否相等,只有這兩個(gè)類是由同一個(gè)類加載器加載才有意義。否則,即使這兩個(gè)類是來源于同一個(gè)Class文件,只要加載它們的類加載器不同,那么這兩個(gè)類必定不相等。1.?什么是類加載器?
把類加載的過程放到Java虛擬機(jī)外部去實(shí)現(xiàn),讓應(yīng)用程序決定如何去獲取所需要的類。實(shí)現(xiàn)這個(gè)動(dòng)作的代碼模塊稱為“類加載器”。??
2.?有哪些類加載器,分別加載哪些類
類加載器按照層次,從頂層到底層,分為以下三種:?
(1)啟動(dòng)類加載器?:?它用來加載?Java?的核心庫,比如String、System這些類?
(2)擴(kuò)展類加載器?:?它用來加載?Java?的擴(kuò)展庫。
(3)?應(yīng)用程序類加載器?:?負(fù)責(zé)加載用戶類路徑上所指定的類庫,一般來說,Java?應(yīng)用的類都是由它來完成加載的。
3.?雙親委派模型
我們應(yīng)用程序都是由以上三種類加載器互相配合進(jìn)行加載的,還可以加入自己定義的類加載器。稱為?類加載器的雙親委派模型?,這里類加載器之間的父子關(guān)系一般不會(huì)以繼承的關(guān)系來實(shí)現(xiàn),而是都使用?組合關(guān)系?來復(fù)用父加載器的。
4.?雙親委托模型的工作原理
是當(dāng)一個(gè)類加載器收到了類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器去完成,每一個(gè)層次的類加載都是如此,因此所有的加載請(qǐng)求最終都應(yīng)該傳送到頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器反饋?zhàn)约簾o法加載這個(gè)加載請(qǐng)求的時(shí)候,子加載器才會(huì)嘗試自己去加載。
5.?使用雙親委派模型好處?(原因)
第一:可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,子類不需要再次加載。
第二:考慮到安全因素,如果不使用這種委托模式,那我們就可以隨時(shí)使用自定義的String來動(dòng)態(tài)替代java核心api中定義類型,這樣會(huì)存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring已經(jīng)在啟動(dòng)時(shí)被加載,所以用戶自定義類是無法加載一個(gè)自定義的類裝載器。
轉(zhuǎn)載于:https://www.cnblogs.com/lyr612556/p/7820172.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的随笔18 java中的类加载器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017 ACM/ICPC(西安)赛后总
- 下一篇: 10W学习笔记——查询之联接