裝載:經過累的全限定名獲取二進制字節流,將二進制字節流轉換成方法區中的運行時數據結構,在內存中生成Java.lang.class對象;html
連接:執行下面的校驗、準備和解析步驟,其中解析步驟是能夠選擇的;java
校驗:檢查導入類或接口的二進制數據的正確性;(文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證)程序員
準備:給類的靜態變量分配並初始化存儲空間;sql
解析:將常量池中的符號引用轉成直接引用;數據庫
初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊,並初始化程序員設置的變量值。數據結構
二 分析 Class.forName()和ClassLoader.loadClasside
Class.forName(className)方法,內部實際調用的方法是 Class.forName(className,true,classloader); 第2個boolean參數表示類是否須要初始化, Class.forName(className)默認是須要初始化。 一旦初始化,就會觸發目標對象的 static塊代碼執行,static參數也也會被再次初始化。 ClassLoader.loadClass(className)方法,內部實際調用的方法是 ClassLoader.loadClass(className,false); 第2個 boolean參數,表示目標對象是否進行連接,false表示不進行連接,由上面介紹能夠, 不進行連接意味着不進行包括初始化等一些列步驟,那麼靜態塊和靜態對象就不會獲得執行
三 數據庫連接爲何使用Class.forName(className)code
JDBC Driver源碼以下,所以使用Class.forName(classname)才能在反射回去類的時候執行static塊。htm
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}對象