類的加載機制

一、類的加載過程

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-hant/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

發表回復

登錄後才能評論