1. 程式人生 > >JDK類載入機制原始碼分析及原始碼分析

JDK類載入機制原始碼分析及原始碼分析

JVM的類載入機制主要有如下三種機制: 1.全盤負責:所謂全盤負責,就是說當一個類載入器載入個個Class的時候,該Class所依賴和引用的其他Class也將由該類載入 器負責載入,除非使用另外一個類載入器來載入。 2.雙親委託:所謂雙親委託則是先讓parent(父)類載入器試圖載入該Class(若父載入器仍有父類載入器,則繼續委託),只有在父類載入 器無法載入該類時才嘗試從自己的類路徑中載入該類。

3.快取機制:快取機制將會保證所有被載入過的Class都會被快取,當程式中需要使用某個類時,類載入器會先從快取中搜尋該Class, 只有當快取中不存在該Class物件時,系統才會重新讀取該類的二進位制資料,並將其轉化為Class物件,並存入Cache。這 就是為什麼我們修改了Class後,程式必須重新啟動JVM,程式所作的修改才會生效的原因。

原始碼分析: 檢視ClassLoader類的原始碼:  protected synchronized Class<?> loadClass(String name, boolean resolve)  throws ClassNotFoundException     {  // First, check if the class has already been loaded  Class c = findLoadedClass(name);//從快取中查詢Class  if (c == null) {      try {   if (parent != null) {       c = parent.loadClass(name, false);//若父親不為空,則委託給父親載入   } else {       c = findBootstrapClass0(name);//若父親為空,則委託給啟動類載入器載入,啟動類載入器是空的   }      } catch (ClassNotFoundException e) {          // If still not found, then invoke findClass in order          // to find the class.          c = findClass(name);//若上面沒找到,則自己載入,自己載入的方法寫在findClass中,在ClassLoader中,是一個空實現      }  }  if (resolve) {      resolveClass(c);  }  return c;     }