核心作用
Class.forName(String className) 要求 JVM 查找、加載、鏈接、初始化指定類,**執行類的靜態代碼塊**,返回 Class 對象。
與 newInstance() 區別
| 特性 | new 關鍵字 | Class.forName().newInstance() |
| 類型 | 強類型(編譯期確定) | 弱類型(運行期字符串) |
| 構造器 | 任意 public 構造器 | 僅無參構造器 |
| 效率 | 高(直接調用) | 低(反射開銷) |
| 解耦 | 緊耦合 | 鬆耦合,支援配置驅動 |
JVM 加載流程
- 加載:讀取 .class 字節碼,生成
Class 對象
- 鏈接:驗證、準備(靜態字段賦默認值)、解析(符號引用→直接引用)
- 初始化:執行
<clinit>()(靜態字段賦值+靜態代碼塊)
forName 觸發完整初始化;newInstance 前提是類已初始化。
工廠模式典型應用
String className = config.getProperty("impl.class"); // 從 XML/Properties 讀取
Class> clazz = Class.forName(className);
Service service = (Service) clazz.getDeclaredConstructor().newInstance();
實現 OCP 原則:新增實現類無需修改工廠代碼。
JDBC 驅動註冊機制
public class MyDriver implements Driver {
static { DriverManager.registerDriver(new MyDriver()); }
}
因此 Class.forName("com.mysql.jdbc.Driver") 僅觸發靜態塊註冊,**無需調用 newInstance()**;部分老教程保留調用屬於歷史遺留。
異常處理
ClassNotFoundException:類路徑缺失
NoClassDefFoundError:依賴類缺失或靜態初始化拋異常
InstantiationException:無公共無參構造器
IllegalAccessException:構造器非 public
- 上一篇文章: 無序鏈表去重算法:C 語言與 Java 兩種實現對比
- 下一篇文章: Java 移位運算符完全指南:<<、>>、>>> 原理與實戰技巧
Copyright ©
程式碼之家 All Rights Reserved