// 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
關鍵發現:
forName() 時)。.class 不觸發初始化;forName() 觸發靜態初始化;new 對象觸發完整初始化(靜態→非靜態→構造器)。編譯期生成 .class 文件;運行時 JVM 檢查類是否已加載:
.class 文件加載到方法區,生成 Class 對象。因此,Class 對象是類在方法區的運行時數據結構入口,三種獲取方式本質上都是「獲取這個唯一的入口」,差別在於是否觸發類的初始化階段。
Class.forName("com.mysql.jdbc.Driver")) → Class.forName()。