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

fornamejava

發布時間: 2022-06-09 14:48:13

java 中的class.forName()是什麼意思

Class.forName:返回與給定的字元串名稱相關聯類或介面的Class對象。

Class.forName是一個靜態方法,同樣可以用來載入類。該方法有兩種形式:Class.forName(String name, boolean initialize, ClassLoader loader)和Class.forName(String className)。第一種形式的參數name表示的是類的全名;initialize表示是否初始化類;loader表示載入時使用的類載入器。第二種形式則相當於設置了參數initialize的值為true,loader的值為當前類的類載入器。

如下圖所示,java類型的屬性名稱叫name,可以通過forName的方法獲取到這個類的實例,從而獲取到類裡面的屬性。

(1)fornamejava擴展閱讀:

注意:

在指定類給 class.forName() 方法後,如果找不到指定的類,會拋出ClassNotFoundException異常。Class 的靜態 forName() 方法有兩個版本,上面的代碼是只指定類名稱的版本,而另一個版本可以讓你指定類名稱、載入時是否運行靜態區塊、指定類載入器:

Static Class forName(String name, boolean initialize, ClassLoader loader)

默認在載入類的時候,如果類中有定義靜態區塊則會運行它。你可以使用 class.forName() 的第二個版本,將initialize設定為 false,這樣在載入類時並不會立即運行靜態區塊,而會在使用類建立對象時才運行靜態區塊。為了印證,可以先設計一個測試類:

package cn.sunzn.demo;public class TestClass { static {
System.out.println("[運行靜態區塊]");
}

}

② java中class.forname是什麼類

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

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

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

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

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

首先你要明白在java裡面任何class都要裝載在虛擬機上才能運行。這句話就是裝載類用的(和new 不一樣,要分清楚)。

至於什麼時候用,你可以考慮一下這個問題,給你一個字元串變數,它代表一個類的包名和類名,你怎麼實例化它?只有你提到的這個方法了,不過要再加一點。
A a = (A)Class.forName("pacage.A").newInstance();
這和你
A a = new A();
是一樣的效果。

關於補充的問題
答案是肯定的,jvm會執行靜態代碼段,你要記住一個概念,靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼了。而且以後不會再走這段靜態代碼了。
你可以編個小程序看看就知道了。。。

④ 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中的getName,class 和forName的區別

沒有getName,只有實例化對象.getClass().getName(); 獲取class名稱。例如:

		Stringname="";
name.getClass().getName();

Class.forName();是為了獲取class的位元組碼,是映射。例如:

		Classclazz=Class.forName("java.lang.String");
StringnewInstance=(String)clazz.newInstance();

⑥ 求class.forname的用法。。(java)

public static Class<?> forName(String className)
throws ClassNotFoundException
返回與帶有給定字元串名的類或介面相關聯的 Class 對象。調用此方法等效於:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示當前類的定義類載入器。
例如,以下代碼片段返回命名為 java.lang.Thread 的類的運行時 Class 描述符。

Class t = Class.forName("java.lang.Thread")
調用 forName("X") 將導致命名為 X 的類被初始化。

參數:
className - 所需類的完全限定名。
返回:
具有指定名的類的 Class 對象。
拋出:
LinkageError - 如果鏈接失敗
ExceptionInInitializerError - 如果此方法所激發的初始化失敗
ClassNotFoundException - 如果無法定位該類
以上是jdk文檔的說明

返回的是--- 帶有給定字元串名的類或介面相關聯的 Class 對象---
相關聯的Class對象。。即這個Class對象里包含了這個類活介面的信息。。比如方法,屬性等。。

可以用來載入類。。因為---調用此方法等效於:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示當前類的定義類載入器。 ----
即調用這個方法的話currentLoader這個類載入器就會載入這個類。。

用得最多的就是反射了。。即你只需要告訴我類名我就能調用你的方法。。設置你的屬性。。
所以我可以在你的類還沒寫的時候就調用你的類的方法--很抽象吧。。
因為我將類名設成我方法的參數或者是你的類的對應的Class對象設為參數。。
這樣我可以通過它獲得方法。。然後調用。。你用我寫的東西的時候把類名或者是對應的Class對象傳給我就是了。。

⑦ JAVA 中的forName怎麼用

它是class類裡面的一個方法,通過class.forName(String),可以通過String值來得到這個對象,這就是簡單的反射。用的地方很多啊,在java類中來得到資料庫的連接的時候,就可以用class.forName((資料庫的驅動器))來得到資料庫的連接。

⑧ Java:Class.forName()會將一個類載入入到虛擬機嗎

//會載入類的。
//下面有一個舉例說明。
public class Exam
{
public static void main(String[] args) throws Exception
{
// 會輸出:
// 靜態初始化塊
// 調用函數設置靜態變數N的值為:100
// 所以,Class.forName("C");載入了類C。
Class.forName("C");
}
}

class C
{
static
{
System.out.println("靜態初始化塊");
}
static int getN()
{
int t=100;
System.out.println("調用函數設置靜態變數N的值為:"+t);
return t;
}
static int N=C.getN();
}

⑨ java中的class.forname如何理解

Class classObj = Class.forName("類名");
..嘗試根據類地址(類名)獲取一個類的類型(Class)對象(這么說好糾結...)....
Class對象可以獲取這個class中的方法以及屬性,也可以用它來創建此類的對象(反射機制)

你可能是在寫連接資料庫時載入資料庫驅動的時候(對...你也可以這么理解..)遇上這段代碼...
..當載入驅動類的時候.會相應的執行該驅動類中 static{}代碼塊.從而達到不可告人的秘密..(我不知道..但是偶理解是在static代碼塊里修改了其他JDBC類中的靜態屬性,如連接方式啥地..,這樣在DriverManager獲取連接時 獲取方式就是驅動類所指定的...當然 你也可以不使用jdbc介面,可以直接調用驅動類去獲取連接..不推薦)

⑩ JAVA反射中通過Class.forname()如何帶參數的方法怎麼賦值和調用呀

forName()是java.lang.Class類的一個方法, 如下
static Class forName(String className) :

返回與帶有給定字元串名的類或介面相關聯的 Class 對象 。
這句話說的太繞口了,舉個例子吧:

Class t = Class.forName("java.lang.Thread")
執行完這句話,Thread類將被虛擬機載入了
類載入以後就可以創建實例,調用屬性和方法嘍。

熱點內容
ea伺服器怎麼連接 發布:2025-02-08 05:16:45 瀏覽:461
更加密更改 發布:2025-02-08 05:15:20 瀏覽:784
倉儲資源配置都需要開展哪些任務 發布:2025-02-08 05:13:51 瀏覽:676
探針資料庫 發布:2025-02-08 05:13:35 瀏覽:80
cfft演算法 發布:2025-02-08 04:53:59 瀏覽:961
極客學院php 發布:2025-02-08 04:52:32 瀏覽:779
書本編譯是什麼意思 發布:2025-02-08 04:45:56 瀏覽:953
淘寶密碼賬號在哪裡看 發布:2025-02-08 04:29:39 瀏覽:537
描繪四季的美文寫一份朗讀腳本 發布:2025-02-08 04:29:21 瀏覽:139
金蝶軟體伺服器是電腦嗎 發布:2025-02-08 04:27:06 瀏覽:974