A. java 中的Class.forName("String");是什麼東西
暈..
拜託那些沒學明白的人
不會就別亂回答別人的問題好么..
或許我這么寫你就明白了..
Class.forName(string
className);
該方法的參數是一個字元串類型的參數,這句話的意思是要把傳進去的字元串當作一種類型試著載入到內存中,比如
你學Java肯定學過連接資料庫的類吧...
最一開始的寫法肯定是要把資料庫驅動類載入到內存
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
這句話的意思就是說..
要把com.microsoft.sqlserver.jdbc.SQLServerDriver這個類型載入到內存中
僅此而已..
[原創答案,復制可恥
--
l.a.r]
B. 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的方法獲取到這個類的實例,從而獲取到類裡面的屬性。
注意:
在指定類給 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("[運行靜態區塊]");
}
}
C. 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)。
D. java中class.forname後跟的是對象還是類
既不是類,也不是對象,而是類名,字元串類型。這樣類載入器會載入這個類。不需要實例化。
E. java Class.forname("Classname");
這個屬於java反射機制,通過類名創建類對象,應該給定全路徑包名的
Class.forName("Cake");得到Cake類的類對象
forname()方法屬於Class類的一個靜態方法
F. JAVA 獲取class對象 類名.class Class.forName()兩種方法什麼情況下使用 為什麼
Class.forName()是根據類名稱載入類 比如有一個類名為com.abc.AAA 此處Class.forName(『com.abc.AAA 』).newInstance()就會創建一個AAA對象而.class一般用來獲取類的通用屬性 比如AAA.class.getDeclareMethod()是獲取AAA類的所有聲明的方法 主要用於反射機制
G. JAVA中,Class.forName()是做什麼用的當我使用一個類的時候,直接使用不就完了嗎
有些類在你編譯的時候是沒有的。運行的時候才有的。
比如android對吧,載入的android.jar並不包含所有的類。真的一些ContextImpl等是沒有包含在裡面的,如果你不用Class.forName的話,就沒有辦法進行編譯。
而就像我剛說的那樣,只要你知道這個類的介面。就可以調用裡面的public method。
比如當你知道可以import Context 卻不可以import ContextImpl的話,
可以
Classc=Class.forName("xxx.xxx.ContextImpl");
Contextctx=(Context)c.newInstance(xx,xxx);
就可以直接調用ctx.getXXXX之類的了。
H. 請問java下Class.forName的作用是什麼,為什麼要使用它
首先你要明白在java裡面任何class都要裝載在虛擬機上才能運行。這句話就是裝載類用的(和new 不一樣,要分清楚)。
至於什麼時候用,你可以考慮一下這個問題,給你一個字元串變數,它代表一個類的包名和類名,你怎麼實例化它?只有你提到的這個方法了,不過要再加一點。
A a = (A)Class.forName("pacage.A").newInstance();
這和你
A a = new A();
是一樣的效果。
關於補充的問題
答案是肯定的,jvm會執行靜態代碼段,你要記住一個概念,靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼了。而且以後不會再走這段靜態代碼了。
你可以編個小程序看看就知道了。。。
I. java中的class.forname如何理解
Class.forName(類名)表示嘗試調用這個類,如果這個類不可用的話會拋出異常。
J. java中class.forname是什麼類
Class是一個類,表示對所有java類進行的一個抽象。可以看jdk說明如下:
forName(String classname)是它的一個靜態方法,可以通過className返回一個類對象。比如資料庫連接中常用這句代碼:
Class driver=Class.forName("jdbc.mysql.jdbc.driver");
參數是驅動類的名字,這句代碼表示通過jdbc包返回一個驅動類對象!