當前位置:首頁 » 編程語言 » javaforname

javaforname

發布時間: 2023-08-30 00:12:47

java下Class.forName的作用是什麼,為什麼要使用它

官方文檔

返回與帶有給定字元串名的類或介面相關聯的 Class 對象。調用此方法等效於:

Class.forName(className, true, currentLoader)

其中 currentLoader 表示此類的定義類載入器。

例如,以下代碼片段返回 java.lang.Thread 類的運行時 Class 描述符。

Class t = Class.forName("java.lang.Thread")

調用 forName("X") 將導致名為 X 的類被初始化。

參數:

className - 所需類的完全限定名。

返回:

具有指定名的類的 Class 對象。

通俗的說就是:獲得字元串參數中指定的類,並初始化該類

類裝載

類裝載就是把一個類或是一個介面的位元組碼文件,通過解析該位元組碼來構建代表這個類或是這個介面的實例的過程。 這個位元組碼文件來源可能是壓縮包、網路、運行時編譯出的或者自動生成的class文件,jvm spec沒有規定必須從什麼地方載入。

類裝載的兩種方式:

1.Class c1 = Class.forName ("java.lang.String");

2.ClassLoader cl = new ClassLoader();

Class cl.loadClass( String name, boolean resolve );

兩種裝載方法的區別:

不同的類裝載器

Class.forName是從指定的classloader中裝載類,如果沒有指定,也就是一個參數的時候,是從裝載當前對象實例所在的classloader中裝載類。

而ClassLoader的實例調用loadclass方法,是指從當前ClassLoader實例中調用類,而這個實例與裝載當前所在類實例的Classloader也許不是同一個.

說白了就是他們實現裝載的時候,使用的類裝載器的指定是不同的。那為什麼使用不同的ClassLoader來裝載類呢?

其實使用多個classloader載入類的情況非常常見,比如說我們的app server都是這樣的. 在Web與EJB間, 他們的classLoader就是不同的,這樣做的目的就是為了避免兩者間類裝載的相互干擾。

是否實例化類

Class的裝載分了三個階段,loading(裝載),linking(連接)和initializing(實例化)分別定義在The Java Language Specification的12.2,12.3和12.4。

Class.forName(className)實際上是調用Class.forName(className, true, this.getClass().getClassLoader())。注意第二個參數,是指Class被loading後是不是必須被初始化。

ClassLoader.loadClass(className)實際上調用的是ClassLoader.loadClass(name, false),第二個參數指出Class是否被link。

區別就出來了。Class.forName(className)裝載的class已經被實例化,而ClassLoader.loadClass(className)裝載的class還沒有被link,所以就更談不上實例化了。

簡單說,就是通過類名反射出類的對象 。

一般情況下,這兩個方法效果一樣,都能裝載Class。但如果程序需要Class被實例化,就必須用Class.forName(name)了。

例如,在JDBC中載入mysql的驅動類時(關於注冊jdbc驅動請參看另外一篇文章,jdbc注冊驅動的三種方式),Class.forName("com.mysql.jdbc.Driver"),如果換成getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行,因為它只是向jvm裝載了Driver並沒有實例化,就不能執行響應的操作。

打開com.mysql.jdbc.Driver的源代碼看看,

//

// Register ourselves with the DriverManager

//

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

可以看到,Driver在static塊中會注冊自己到java.sql.DriverManager。而static塊就是在Class的初始化中被執行。所以這個地方就只能用Class.forName(className)。

㈡ java中class.forname是什麼類

Class是一個類,表示對所有java類進行的一個抽象。可以看jdk說明如下:

forName(String classname)是它的一個靜態方法,可以通過className返回一個類對象。比如資料庫連接中常用這句代碼:

Class driver=Class.forName("jdbc.mysql.jdbc.driver");

參數是驅動類的名字,這句代碼表示通過jdbc包返回一個驅動類對象!

㈢ java Class.forname("Classname");

這個屬於java反射機制,通過類名創建類對象,應該給定全路徑包名的
Class.forName("Cake");得到Cake類的類對象
forname()方法屬於Class類的一個靜態方法

熱點內容
編程課v 發布:2025-02-04 08:45:00 瀏覽:103
模擬器能有手機腳本么 發布:2025-02-04 08:39:50 瀏覽:756
android顯示html圖片 發布:2025-02-04 08:35:31 瀏覽:791
如何查學信網賬號及密碼 發布:2025-02-04 08:33:55 瀏覽:502
linux32位jdk 發布:2025-02-04 08:33:55 瀏覽:247
康佳伺服器連接失敗是怎麼回事 發布:2025-02-04 08:18:51 瀏覽:916
編譯編譯有什麼 發布:2025-02-04 08:05:52 瀏覽:735
讓外網訪問內網伺服器 發布:2025-02-04 08:02:20 瀏覽:783
奶塊腳本菜地 發布:2025-02-04 07:46:35 瀏覽:238
條形碼識別源碼 發布:2025-02-04 07:45:55 瀏覽:457