首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Class 對象深度解析:.class、forName()、getClass() 三種獲取方式的本質區別

     編輯:Java 綜合教學

Class 對象的三種生成途徑

  1. 類名.class:JVM 使用類加載器將類加載入內存(若未加載),不進行類初始化,返回 Class 對象。
  2. Class.forName("全限定類名"):加載類並執行靜態初始化(靜態變量賦值、靜態代碼塊),返回 Class 對象。
  3. 實例對象.getClass():觸發靜態初始化、非靜態初始化及構造器執行,返回運行時真實對象所屬的 Class 對象(支持多態)。

驗證實驗:觀察初始化時機

// TestClass.java
public class TestClass {
    public static void main(String[] args) {
        try {
            // 1. 類名.class
            Class testTypeClass = TestClassType.class;
            System.out.println("testTypeClass---" + testTypeClass);

            // 2. Class.forName()
            Class testTypeForName = Class.forName("ClassTest.TestClassType");
            System.out.println("testTypeForName---" + testTypeForName);

            // 3. obj.getClass()
            TestClassType testTypeGetClass = new TestClassType();
            System.out.println("testTypeGetClass---" + testTypeGetClass.getClass());
        } catch (ClassNotFoundException e) { e.printStackTrace(); }
    }
}

// TestClassType.java
public class TestClassType {
    public TestClassType() { System.out.println("----構造函數---"); }
    static { System.out.println("---靜態的參數初始化---"); }
    { System.out.println("----非靜態的參數初始化---"); }
}

運行結果分析

testTypeClass---class ClassTest.TestClassType
---靜態的參數初始化---
testTypeForName---class ClassTest.TestClassType
----非靜態的參數初始化---
----構造函數---
testTypeGetClass---class ClassTest.TestClassType

關鍵發現:

  • 三種方式返回同一個 Class 對象(JVM 保證每個類只有一個 Class 實例)。
  • 靜態初始化只執行一次(在首次主動使用類時,即 forName() 時)。
  • .class 不觸發初始化;forName() 觸發靜態初始化;new 對象觸發完整初始化(靜態→非靜態→構造器)。

底層機制總結

編譯期生成 .class 文件;運行時 JVM 檢查類是否已加載:

  • 未加載 → 讀取 .class 文件加載到方法區,生成 Class 對象。
  • 已加載 → 直接使用現有 Class 對象。

因此,Class 對象是類在方法區的運行時數據結構入口,三種獲取方式本質上都是「獲取這個唯一的入口」,差別在於是否觸發類的初始化階段。

實戰選擇建議

  • 僅需 Class 對象(如反射獲取聲明信息) → 類名.class(效率最高,無副作用)。
  • 需觸發靜態初始化(如註冊驅動 Class.forName("com.mysql.jdbc.Driver")) → Class.forName()。
  • 已有實例對象,需獲取其真實運行時類型(多態場景) → obj.getClass()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved