4 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
這個(gè)屬于java反射機(jī)制,通過(guò)類(lèi)名創(chuàng)建類(lèi)對(duì)象,應(yīng)該給定全路徑包名的
Class.forName("Cake");得到Cake類(lèi)的類(lèi)對(duì)象
forname()方法屬于Class類(lèi)的一個(gè)靜態(tài)方法

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
是的 必須給定全路徑,要想省略前面的包名可以這樣寫(xiě):
package test;
public class Test {
public static void main(String[] args) {
Test instance = null;
try {
instance = (Test) Class.forName("test." + args[0]).newInstance(); // 直接在前面先加上包名
// ........
} catch (Exception e) {
e.printStackTrace();
}
}
}

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