1. 程式人生 > >類加載器體系架構和工作原理

類加載器體系架構和工作原理

每一個 工作原理 自定義 jar cat 嘗試 定義類 ava 類名

類加載器有三種分別是:
啟動類加載器(Bootstrap ClassLoader):是java虛擬機jvm識別,java程序無法直接使用;
擴展類加載器(Extension ClassLoader):開發者可以直接使用擴展類加載器
應用程序類加載器(Application ClassLoader):一般情況下這個就是程序中默認的類加載器。
應用程序都是由這3種類加載器互相配合進行加載的

啟動類加載器(Bootstrap ClassLoader)<-- 擴展類加載器(Extension ClassLoader)<-- 應用程序類加載器(Application ClassLoader)<-- 自定義類加載器(User Classloader)

工作原理:雙親委派模型

雙親委派模型要求除了頂層的啟動類加載器外,其余的類加載器都應當有自己的父類加載器,一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,
只有當父加載器反饋自己無法完成這個加載請求(它的搜索範圍中沒有找到所需的類)時,子加載器才會嘗試自己去加載

這種模式的好處是:無論哪一個類加載器要加載這個類(如java.lang.Object,它存放在rt.jar之中),最終都是委派給頂層類加載器加載,因此在各個類加載器環境加載的都是同一個類,如果不使用雙親委派模型,會出現多個不同的類

在JVM中表示兩個class對象是否為同一個類對象存在兩個必要條件:

其一:類的完整類名必須一致,包括包名。

其二:加載這個類的ClassLoader(指ClassLoader實例對象)必須相同。

即:不重寫loadClass方法,不同的類加載器加載加載同一個類時,將生成一個實例;
相反,自定義的類加載器重寫了loadClass方法,就算加載的是同一個類,也將生成不同的實例

類加載器體系架構和工作原理