更新時(shí)間:2020-10-26 17:44:09 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1505次
與傳統(tǒng)的通過(guò)new 來(lái)獲取對(duì)象的方式不同,利用Java反射獲取對(duì)象會(huì)先拿到Hero的“類對(duì)象”,然后通過(guò)類對(duì)象獲取“構(gòu)造器對(duì)象”再通過(guò)構(gòu)造器對(duì)象創(chuàng)建一個(gè)對(duì)象。這種獲取對(duì)象的方式相對(duì)來(lái)說(shuō)更加安全,能夠利用Java反射的特性來(lái)獲取對(duì)象。
利用Java反射機(jī)制獲取對(duì)象的具體步驟如下:
1.獲取類對(duì)象 Class class = Class.forName("pojo.Hero");
2.獲取構(gòu)造器對(duì)象 Constructor con = clazz.getConstructor(形參.class);
3 獲取對(duì)象 Hero hero =con.newInstance(實(shí)參);
上面是最簡(jiǎn)單的獲取方法,當(dāng)Hero的構(gòu)造方法不是無(wú)參構(gòu)造方法時(shí),獲取構(gòu)造器對(duì)象略有不同,見(jiàn)下面測(cè)試:
構(gòu)造方法不同時(shí),獲取構(gòu)造器對(duì)象的方法
示例:
Hero類添加6種構(gòu)造方法
//---------------構(gòu)造方法-------------------
//(默認(rèn)的構(gòu)造方法)
Hero(String str){
System.out.println("(默認(rèn))的構(gòu)造方法 s = " + str);
}
//無(wú)參構(gòu)造方法
public Hero(){
System.out.println("調(diào)用了公有、無(wú)參構(gòu)造方法執(zhí)行了。。。");
}
//有一個(gè)參數(shù)的構(gòu)造方法
public Hero(char name){
System.out.println("姓名:" + name);
}
//有多個(gè)參數(shù)的構(gòu)造方法
public Hero(String name ,float hp){
System.out.println("姓名:"+name+"血量:"+ hp);
}
//受保護(hù)的構(gòu)造方法
protected Hero(boolean n){
System.out.println("受保護(hù)的構(gòu)造方法 n = " + n);
}
//私有構(gòu)造方法
private Hero(float hp){
System.out.println("私有的構(gòu)造方法 血量:"+ hp);
}
通過(guò)反射機(jī)制獲取對(duì)象:
package test;
public class ConstructorTest {
/*
* 通過(guò)Class對(duì)象可以獲取某個(gè)類中的:構(gòu)造方法、成員變量、成員方法;并訪問(wèn)成員;
*
* 1.獲取構(gòu)造方法:
* 1).批量的方法:
* public Constructor[] getConstructors():所有"公有的"構(gòu)造方法
public Constructor[] getDeclaredConstructors():獲取所有的構(gòu)造方法(包括私有、受保護(hù)、默認(rèn)、公有)
* 2).獲取單個(gè)的方法,并調(diào)用:
* public Constructor getConstructor(Class... parameterTypes):獲取單個(gè)的"公有的"構(gòu)造方法:
* public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個(gè)構(gòu)造方法"可以是私有的,或受保護(hù)、默認(rèn)、公有;
*
* 2.創(chuàng)建對(duì)象
* Constructor對(duì)象調(diào)用newInstance(Object... initargs)
*/
public static void main(String[] args) throws Exception {
//1.加載Class對(duì)象
Class clazz = Class.forName("pojo.Hero");
//2.獲取所有公有構(gòu)造方法
System.out.println("**********************所有公有構(gòu)造方法*********************************");
Constructor[] conArray = clazz.getConstructors();
for(Constructor c : conArray){
System.out.println(c);
}
System.out.println("************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)***************");
conArray = clazz.getDeclaredConstructors();
for(Constructor c : conArray){
System.out.println(c);
}
System.out.println("*****************獲取公有、無(wú)參的構(gòu)造方法*******************************");
Constructor con = clazz.getConstructor(null);
//1>、因?yàn)槭菬o(wú)參的構(gòu)造方法所以類型是一個(gè)null,不寫(xiě)也可以:這里需要的是一個(gè)參數(shù)的類型,切記是類型
//2>、返回的是描述這個(gè)無(wú)參構(gòu)造函數(shù)的類對(duì)象。
System.out.println("con = " + con);
//調(diào)用構(gòu)造方法
Object obj = con.newInstance();
System.out.println("******************獲取私有構(gòu)造方法,并調(diào)用*******************************");
con = clazz.getDeclaredConstructor(float.class);
System.out.println(con);
//調(diào)用構(gòu)造方法
con.setAccessible(true);//暴力訪問(wèn)(忽略掉訪問(wèn)修飾符)
obj = con.newInstance(100);
}
}
輸出:
**********************所有公有構(gòu)造方法*********************************
public pojo.Hero(java.lang.String,float)
public pojo.Hero(char)
public pojo.Hero()
************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)***************
private pojo.Hero(float)
protected pojo.Hero(boolean)
public pojo.Hero(java.lang.String,float)
public pojo.Hero(char)
public pojo.Hero()
pojo.Hero(java.lang.String)
*****************獲取公有、無(wú)參的構(gòu)造方法*******************************
con = public pojo.Hero()
調(diào)用了公有、無(wú)參構(gòu)造方法執(zhí)行了。。。
******************獲取私有構(gòu)造方法,并調(diào)用*******************************
private pojo.Hero(float)
私有的構(gòu)造方法 血量:100.0
綜上所述,我們能夠得出以下結(jié)論:
1.獲取構(gòu)造器對(duì)象方法:
1).批量的方法:
public Constructor[] getConstructors():所有"公有的"構(gòu)造方法
public Constructor[] getDeclaredConstructors():獲取所有的構(gòu)造方法(包括私有、受保護(hù)、默認(rèn)、公有)
2).獲取單個(gè)的方法:
public Constructor getConstructor(Class… parameterTypes): 獲取單個(gè)的"公有的"構(gòu)造方法
public Constructor getDeclaredConstructor(Class…parameterTypes):獲取"某個(gè)構(gòu)造方法"可以是私有的,或受保護(hù)、默認(rèn)、公有;
以上就是關(guān)于利用Java反射機(jī)制來(lái)獲取對(duì)象的介紹,當(dāng)然這只是Java反射機(jī)制的一個(gè)很小的用處,Java反射是Java中的一個(gè)重點(diǎn)內(nèi)容,想要更深入學(xué)習(xí)Java反射機(jī)制的小伙伴可以觀看本站的Java基礎(chǔ)教程,解鎖Java機(jī)制的更多精彩內(nèi)容!
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)