類的載入機制

一、類的載入過程

Java虛擬機在運行時會動態載入需要用到的類,稱為「類的載入」。類的載入可以分三個步驟:載入、連接和初始化。

1、載入:在載入階段,類載入器首先通過類的全限定名來讀取類的二進位數據,並將其存放在JVM的方法區中。類的全限定名是包含了包名的全稱,如”java.lang.Object”。

2、連接:在連接階段,類的驗證、準備和解析都會在此階段進行。

(1)驗證:驗證是確保被載入的類符合JVM規範的一個重要步驟。如果類的驗證不通過,則會拋出異常並終止程序運行。

public class VerifyTest {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}

(2)準備:準備是為靜態變數分配內存空間並設置默認值的過程。在此階段,類中聲明的所有static變數都會賦值為默認值。

public class PrepareTest {
    private static int num;
    private static String str;

    public static void main(String[] args) {
        System.out.println(num); // 輸出 0
        System.out.println(str); // 輸出 null
    }
}

(3)解析:解析是將符號引用轉換為直接引用的過程。在解析階段,會將類、介面、欄位和方法的符號引用轉換為直接引用。

public class ResolveTest {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

3、初始化:在初始化階段,類的靜態變數和靜態塊會按照程序中的順序依次執行。

public class StaticBlockTest {
    private static String str = "hello world";
    static {
        System.out.println(str);
    }

    public static void main(String[] args) {
        System.out.println("main method");
    }
}

二、類的載入器

Java虛擬機中有三類類載入器:

1、啟動類載入器:負責載入JRE/lib目錄下的核心類庫,如rt.jar等。

2、擴展類載入器:負責載入JRE/lib/ext目錄下的擴展類庫。

3、應用程序類載入器:負責載入用戶類路徑上所指定的類庫,一般是項目中的class文件和jar包。

除了這三個類載入器之外,還可以通過編寫自定義類載入器來實現特定的載入需求。

三、類的載入機制

類的載入機制是指類的載入器在載入類時的一系列策略和規則。主要有以下幾種:

1、雙親委派模型:Java虛擬機中的類載入器採用了雙親委派模型。即在類載入器載入某個類時,先將這個任務委託給父類載入器完成,如果父類載入器無法完成,則由子類載入器嘗試去載入。

public class ClassLoaderTest {
    public static void main(String[] args) {
        ClassLoader loader = ClassLoaderTest.class.getClassLoader();
        while (loader != null) {
            System.out.println(loader.getClass().getName());
            loader = loader.getParent();
        }
    }
}

2、負責命名空間:每個類載入器都擁有自己的命名空間。命名空間是由該載入器及其所有父類載入器所載入的類所組成的集合。同一個命名空間內的類是有相同的類全稱的,不同命名空間內的類是由不同的類全稱的,即使class文件的位元組碼相同。

public class NameSpaceTest {
    public static void main(String[] args) throws Exception {
        MyClassLoader loader1 = new MyClassLoader("loader1");
        loader1.setPath("C:\\myapp\\loader1\\");
        MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
        loader2.setPath("C:\\myapp\\loader2\\");
        Class clazz1 = loader1.loadClass("com.myapp.Test");
        Class clazz2 = loader2.loadClass("com.myapp.Test");
        System.out.println("clazz1的類載入器為:" + clazz1.getClassLoader().getClass().getName());
        System.out.println("clazz2的類載入器為:" + clazz2.getClassLoader().getClass().getName());
        System.out.println("clazz1和clazz2是否相等:" + (clazz1 == clazz2));
    }
}

3、父類載入器對子類載入器不可見:子類載入器可以訪問父類載入器所載入的類,而父類載入器無法訪問子類載入器所載入的類。

4、系統類載入器和應用程序類載入器都是有啟動類載入器所載入的。

原創文章,作者:IPQWS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/368935.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IPQWS的頭像IPQWS
上一篇 2025-04-12 13:00
下一篇 2025-04-12 13:00

相關推薦

  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • QML 動態載入實踐

    探討 QML 框架下動態載入實現的方法和技巧。 一、實現動態載入的方法 QML 支持從 JavaScript 中動態指定需要載入的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • 類載入的過程中,準備的工作

    類載入是Java中非常重要和複雜的一個過程。在類載入的過程中,準備階段是其中一個非常重要的步驟。準備階段是在類載入的連接階段中的一個子階段,它的主要任務是為類的靜態變數分配內存,並…

    編程 2025-04-28
  • Lazarus LoadLibrary:DLL動態鏈接庫的載入和使用

    本文將從以下幾個方面介紹Lazarus中LoadLibrary和FreeLibrary函數的使用方法: 一、簡介 LoadLibrary和FreeLibrary是Windows動態…

    編程 2025-04-27
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,著重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • Spring Boot本地類和Jar包類載入順序深度剖析

    本文將從多個方面對Spring Boot本地類和Jar包類載入順序做詳細的闡述,並給出相應的代碼示例。 一、類載入機制概述 在介紹Spring Boot本地類和Jar包類載入順序之…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟體設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27
  • 用Python載入鳶尾花數據

    本文將詳細介紹如何使用Python載入鳶尾花數據,包括數據源的介紹、數據的獲取和清洗、數據可視化等方面。 一、數據源的介紹 鳶尾花數據集(Iris dataset)是常用的分類實驗…

    編程 2025-04-27
  • Mescroll.js——移動端下拉刷新和上拉載入更多組件

    一、概述 Mescroll.js是一款移動端的下拉刷新和上拉載入更多組件,因其簡單易用和功能強大而深受開發者的喜愛。Mescroll.js可以應用於各種移動端網站和APP,能夠支持…

    編程 2025-04-25

發表回復

登錄後才能評論