Class.forName()與load.loadClass()比較

Class.forName()與Loader.loadClass()的區別
 兩者的共同性:實現動態擴展程序.
 先來看看兩者的使用方式:
 1、 Class.forName()
 存在兩種方式
public static Class forName(String classname)
public static Class forName(String classname, boolean initialize, ClassLoader loader)
 classname: 類型的全限定名
 initialize: 是否進行連接並初始化
 ClassLoader: 使用的loader, 當爲null時表示使用默認的啓動類loader。
 
 2、load.LoadClass()
 存在兩種方式:
protected Class loadClass(String classname)
protected Class loadClass(String classname, boolean resolve)
 classname: 類型的全限定名
 resolve: 裝載時是否執行該類的連接。(連接包括三個步驟:檢驗被裝載的類型,準備《包括爲類型分配內存》,解析類型中的符號引用《可選》)
 loadClass僅僅試圖裝載請求的類型,而不關心類型是否被連接了。(Java虛擬機規範中對何時實現連接給了一定的自由,因此,即時使用resolve爲true,得到的類型也可能沒有被連接.所以在1.1版本之後,resolve參數就沒有作用了)
 
 好, 現在來看看兩者的不同之處:
 1. Class.forName()的長處: 裝載類型的時候一定會被連接、被初始化, 而loader.loadClass()則不能保證這一點.
 我們什麼時候會需要這個特性呢。最常用的地方就是JDBC驅動程序的裝載(靜態初始化方法中,向DriverManager註冊驅動程序),不僅僅被加載,而且還要保證驅動程序類被初始化。假若一個驅動程序被裝載了,但沒有初始化,那麼類的表態初始化方法就無法被執行,預支程序就沒有在DriverManager中被註冊,驅動程序就無法被應用程序使用.
 2. forName不足:以定製的方式把類型的全限定名轉換成一個Java class文件格式的字節數組。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章