4 回答

TA貢獻(xiàn)1909條經(jīng)驗 獲得超7個贊
Class.forName:返回與給定的字符串名稱相關(guān)聯(lián)類或接口的Class對象。
Class.forName是一個靜態(tài)方法,同樣可以用來加載類。該方法有兩種形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一種形式的參數(shù) name表示的是類的全名;initialize表示是否初始化類;loader表示加載時使用的類加載器。第二種形式則相當(dāng)于設(shè)置了參數(shù) initialize的值為 true,loader的值為當(dāng)前類的類加載器。
如下圖所示,java類型的屬性名稱叫name,可以通過forName的方法獲取到這個類的實例,從而獲取到類里面的屬性。
擴展資料:
注意:
在指定類給 class.forName() 方法后,如果找不到指定的類,會拋出ClassNotFoundException 異常。Class 的靜態(tài) forName() 方法有兩個版本,上面的代碼是只指定類名稱的版本,而另一個版本可以讓你指定類名稱、加載時是否運行靜態(tài)區(qū)塊、指定類加載器:
Static Class forName(String name, boolean initialize, ClassLoader loader)
默認(rèn)在加載類的時候,如果類中有定義靜態(tài)區(qū)塊則會運行它。你可以使用 class.forName() 的第二個版本,將 initialize 設(shè)定為 false,這樣在加載類時并不會立即運行靜態(tài)區(qū)塊,而會在使用類建立對象時才運行靜態(tài)區(qū)塊。為了印證,可以先設(shè)計一個測試類:
package cn.sunzn.demo;public class TestClass { static {System.out.println("[運行靜態(tài)區(qū)塊]");}}

TA貢獻(xiàn)1862條經(jīng)驗 獲得超6個贊
class.forName是用到了java.lang.Class.forName包的方法,他是通過類的全稱來返回一個類,全稱是指包名稱加類名稱,他是通過jvm來加載的。這樣你就可以獲取到這個類了,你可以通過反射來操作這個類,例如獲取屬性,獲取方法等等。這種方式在框架中比較常見。
如下圖所示,App類里面有個String類型的屬性名稱叫name,我們可以通過forName的方法獲取到這個類的實例,從而獲取到類里面的屬性。
擴展資料:
什么時候用Class.forName()?
先來個熱身,給你一個字符串變量,它代表一個類的包名和類名,你怎么實例化它?你第一想到的肯定是new,但是注意一點:
A a = (A)Class.forName(“pacage.A”).newInstance();
這和你 A a = new A(); 是一樣的效果。
現(xiàn)在言歸正傳。
動態(tài)加載和創(chuàng)建Class 對象,比如想根據(jù)用戶輸入的字符串來創(chuàng)建對象時需要用到:
String str = “用戶輸入的字符串” ;
Class t = Class.forName(str);
t.newInstance();
在初始化一個類,生成一個實例的時候,newInstance()方法和new關(guān)鍵字除了一個是方法,一個是關(guān)鍵字外,最主要有什么區(qū)別?
它們的區(qū)別在于創(chuàng)建對象的方式不一樣,前者是使用類加載機制,后者是創(chuàng)建一個新類。
那么為什么會有兩種創(chuàng)建對象方式?這主要考慮到軟件的可伸縮、可擴展和可重用等軟件設(shè)計思想。
添加回答
舉報