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