類加載器,說白了就是加載類的 java
.類加載器負責將.class文件(可能在磁盤上,也可能在網絡上)加載到內存中,併爲之生成對應的java.lang.Class對象 bootstrap
.當JVM啓動時,會造成由三個類加載器組成的初始類加載器層次結構: 網絡
BootStrap----------JRE/lib.jar 根節點類加載器 url
ExtClassLoader-----------JRE/lib/ext/*.jar 擴展類加載器 spa
AppClassLoader-----------CLASSPATH指定的全部jar或目錄 應用類加載器也叫系統加載器 操作系統
BootStrap classloader: 引導(也稱原始)類加載器,他負責加載java的核心類(也就是JDK自帶類) orm
這個加載器是很是特殊的,它實際上不是java.lang.ClassLoader的子類,而是由 JVM自身實 現的。能夠經過執行一下代碼來得到bootstrap classloader 加載了哪些 對象
核心類庫: 內存
URL[] urls = sun.misc.Launcher. getBootstrapClassPath (). getURLs (); ssl
for ( int i = 0; i < urls.length ; i ++) {
System. out .println ( urls [ i ]. toExternalForm ());
}
extension classloader: 擴展類加載器,它負責加載JRE的擴展目錄中的jar包,這爲引入除java核心類之外的新功能
提供了一個標準機制。由於默認的擴展目錄對全部從同一個JRE中啓動的JVM都是通用的所
以,放入這個目錄的JAR類包對全部的JVM和system classloader都是可見的。。
(systemm)App classloader: 系統(也稱爲應用)類加載器,它負責在JVM被啓動時,加載來自在命令java中的
classpath或者java.class.path系統屬性或者CLASSPATH操做系統屬性所指定
的JAR類包和類路徑
全盤負責委託機制:
全盤負責:當一個classloader加載一個class的時候,這個classs所依賴的和引用的其餘class一般也由這個
classloader負責載入。
委託機制: 先讓parent(父)類加載器尋找,只有在parent找不到的時候才從本身的類路徑中尋找。
類加載器還採用了cache機制:
若是cache中保存了這個class就直接反悔它,若是沒有才從文件中讀取和轉換成class,並存入cache,
這就是爲何修改class可是必須從新啓動JVM才能生效,而且類指加載一次的緣由