1. 程式人生 > 實用技巧 >類載入器(ClsaaLoader)的簡單講述

類載入器(ClsaaLoader)的簡單講述

概述:

我們知道當我們第一次使用某一個類的時候,我們需要先將這個類編譯成位元組碼檔案,然後將這個位元組碼檔案載入到記憶體中,這個載入的過程中需要藉助類載入器進行載入進記憶體。

類載入器的分類:

  • 引導類載入器
  • 擴充套件類載入器
  • 系統類載入器
  • 自定義類載入器(不做解釋)

其中我們最常使用的就是系統類載入器,下面我們通過程式碼演示各種類載入器之間的關係:

public class ClassLoaderDemo {
    public static void main(String[] args) {
//通過自定義類預設獲得的是系統類載入器:AppClassLoader
        ClassLoader classLoader = ClassLoaderDemo.class
.getClassLoader(); System.out.println(classLoader); //通過系統類載入器的getParent()方法可以獲得擴充套件類載入器:ExtClassLoader ClassLoader classLoaderParent = classLoader.getParent(); System.out.println(classLoaderParent); //但是我們通過擴充套件類載入器的方法並不能獲得引導類載入器 ClassLoader classLoaderParentParent = classLoaderParent.getParent(); System.out.println(classLoaderParentParent);
//獲得的將是null //引導類載入器是載入java的核心類庫檔案的,它使用c++寫的,所以我們知道String類的載入器也是引導類載入器 //但是我們通過String也並不能獲得引導類載入器 ClassLoader classLoader1 = String.class.getClassLoader(); System.out.println(classLoader1);//輸出的將是null //基本資料型別是核心類庫裡面的東西,所以基本資料型別的類載入器也是引導類載入器 ClassLoader loader = int.class
.getClassLoader(); System.out.println(loader); } }

  1. 所以我們通過自定義類的當前執行時類(也就是本類在記憶體中對應的位元組碼亦或是對應的Class物件的引用)的getClassLoader();

    方法可以獲得系統類載入器(AppClassLoader)

  2. 可以通過系統類載入器的getParent();方法獲得擴充套件類載入器(ExtClassLoader)。

  3. 雖然擴充套件類載入器也可以呼叫getParent();方法,但是卻無法獲取到引導類載入器,獲取之後的輸出結果是null。

三種載入器對應的載入工作:

其實從上圖就可以看出:

  • 引導類載入器主要是對java平臺的核心類庫的載入,而且它使用c++編寫的,是JVM自帶的載入器
    可以把這個載入器想象成皇室成員專用的載入器(String類就是用的這個載入器)
  • 擴充套件類載入器負責對jre/lib/ext目錄下的jar包裝載進工作褲,對java自帶的一些jar包載入。
  • 系統類載入器主要對自定義類的載入。