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