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

Java Class.forName 核心機制深度解析:動態加載、靜態初始化與 JDBC 驅動註冊

     編輯:Java 程式設計入門

核心作用

Class.forName(String className) 要求 JVM 查找、加載、鏈接、初始化指定類,**執行類的靜態代碼塊**,返回 Class 對象。

與 newInstance() 區別

JVM 加載流程

  1. 加載:讀取 .class 字節碼,生成 Class 對象
  2. 鏈接:驗證、準備(靜態字段賦默認值)、解析(符號引用→直接引用)
  3. 初始化:執行 <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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性new 關鍵字Class.forName().newInstance()
類型強類型(編譯期確定)弱類型(運行期字符串)
構造器任意 public 構造器僅無參構造器
效率高(直接調用)低(反射開銷)
解耦緊耦合鬆耦合,支援配置驅動