為什么JVM要采用雙親委派機制加載類呢?
任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機中的唯一性,每一個類加載器,都擁有一個獨立的類名稱空間。
也就是說,判斷2個類是否“相等”,只有在這2個類是由同一個類加載器加載的前提下才有意義,否則即使這2個類來源於同一個Class文件,被同一個虛擬機加載,只要加載它們的類加載器不同,這2個類必定不相等。
基於雙親委派模型設計,那么Java中基礎的類,Object類似Object類重復多次的問題就不會存在了,因為經過層層傳遞,加載請求最終都會被Bootstrap ClassLoader所響應。加載的Object類也會只有一個,否則如果用戶自己編寫了一個java.lang.Object類,並把它放到了ClassPath中,會出現很多個Object類,這樣Java類型體系中最最基礎的行為都無法保證,應用程序也將一片混亂。
雙親委派模型的好處:
1.主要是為了安全性,避免用戶自己編寫的類動態替換JAVA的一些核心類,比如String。
2.同時也避免了類的重復加載,因為JVM中區分不同類,不僅僅是根據類名,相同的class文件被不同的ClassLoader加載就是不同的兩個類。
在JVM中表示兩個class對象是否為同一個類對象存在兩個必要條件:
1.類的完整類名必須一致,包括包名。
2.加載這個類的ClassLoader(指ClassLoader實例對象)必須相同。
