此文參考: http://www.cnblogs.com/liu-5525/p/5614425.htmlhtml
1. classLoader 如何加載 classjava
ClassLoader 負責將 .class 文件(可能在disk上,可能在網絡上) 加載到 RAM 裏面, 併爲之生成對應的 [java.lang.Class] object. 當 JVM 啓動的時候bootstrap
會造成由三個 ClassLoader 組成的 初始類加載器 層次結構: bootstrap classloader --> extension classloader --> system classloader網絡
bootstrap classloader: 引導(也稱爲原始) classloader. 它負責加載 java的核心類. 這個classloader is very special, it is not extended from java.lang.ClassLoader, 而是由JVM自身實現的。 能夠經過執行如下代碼來得到 bootstrap classloader 加載了哪些 core classes.jvm
````` url
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();spa
for(int i=0;i<urls.length;i++){操作系統
System.out.println(urls[i].toExternalForm());orm
}htm
sample output
`````
應爲 JVM 在啓動的時候自動加載它們,因此不須要再 系統屬性CLASSPATH 中指定這些 class
extension classLoader: 擴展類加載器, 它負責加載 JRE 的擴展目錄 (JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系統屬性指定的)
中的 jar 包. 這爲引入除了 core class 之外的新功能提供了一個標準機制. 由於默認的擴展目錄對全部從 同一個 JRE 中 啓動 的 JVM 都是通用的
因此放入這個目錄的 jar 包對全部的 JVM 和 system classloader 都是可見的. extension classLoader 是 system classloader 的parent, 而
bootstrap classloader 是 extension classloader 的 parent, 可是 bootstrap classloader 不是 一個實際的 classloader.
system classloader: 系統(應用)類加載器, 它負責在JVM被啓動時,加載來自命令 java -classpath 或者 java.class.path 系統屬性或者
CLASSPATH 操做系統屬性 所指定的 jar 類包和類路徑.
能夠經過靜態方法 ClassLoader.getSystemClassLoader() 找到該類加載器。若是沒有特別指出,用戶自定義的任何classloader都繼承該加載器
classloader 加載類用的是全盤負責委託機制
全盤負責:當一個classloader加載一個class的時候,這個class所依賴的和引用的全部class 也有這個classloader 負責載入,除非是explicitly use another classloader to load the depended classes.
委託機制: 先讓parent classloader 尋找,只有在parent找不到的時候才從本身的classpath中尋找.
cache 機制: classloader 採用了cache機制, 若是cache 中保存了這個class就直接返回它,若是沒有才從文件中讀取和轉換成class,並存入 cache, 這就是爲何修改了class就必須重新啓動JVM 才能生效的緣由