1)三個類加載器:bootstrap
bootstrap classloader - 引導(也稱爲原始)類加載器,它負責加載Java的核心類。jvm
extension classloader - 擴展類加載器,它負責加載JRE的擴展目錄中JAR的類包。url
system classloader - 系統(也稱爲應用)類加載器,加載應用程序的類。spa
bootstrap classloader不是一個真正的ClassLoader實例orm
2)獲取引導類加載器加載了哪些類:繼承
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls.toExternalForm());
}ssl
3)獲取應用類加載器:get
ClassLoader.getSystemClassLoader()it
4)JVM類加載機制:全盤負責委託機制io
全盤負責:當一個classloader加載一個Class的時候,這個Class所依賴的和引用的全部Class也由這個classloader負責載入,除非是顯式的使用另一個classloader載入;
委託機制:先讓parent(父)類加載器(而不是super,它與parent classloader類不是繼承關係)尋找,只有在parent找不到的時候才從本身的類路徑中去尋找。
Cache機制:若是cache中保存了這個Class就直接返回它,若是沒有才從文件中讀取和轉換成Class,並存入cache,這就是爲何咱們修改了Class可是必須從新啓動JVM才能生效的緣由。
5)每一個ClassLoader加載Class的過程是:
1.檢測此Class是否載入過(即在cache中是否有此Class),若是有到8,若是沒有到22.若是parent classloader不存在(沒有parent,那parent必定是bootstrap classloader了),到43.請求parent classloader載入,若是成功到8,不成功到54.請求jvm從bootstrap classloader中載入,若是成功到85.尋找Class文件(從與此classloader相關的類路徑中尋找)。若是找不到則到7.6.從文件中載入Class,到8.7.拋出ClassNotFoundException.8.返回Class.其中5.6步咱們能夠經過覆蓋ClassLoader的findClass方法來實現本身的載入策略。甚至覆蓋loadClass方法來實現本身的載入過程。