我們通常使用new操作符創(chuàng)建新的實(shí)例:
Personp=newPerson();
如果通過反射來創(chuàng)建新的實(shí)例,可以調(diào)用Class提供的newInstance()方法:
Personp=Person.class.newInstance();
調(diào)用Class.newInstance()的局限是,它只能調(diào)用該類的public無參數(shù)構(gòu)造方法。如果構(gòu)造方法帶有參數(shù),或者不是public,就無法直接通過Class.newInstance()來調(diào)用。
為了調(diào)用任意的構(gòu)造方法,Java的反射API提供了Constructor對(duì)象,它包含一個(gè)構(gòu)造方法的所有信息,可以創(chuàng)建一個(gè)實(shí)例。Constructor對(duì)象和Method非常類似,不同之處僅在于它是一個(gè)構(gòu)造方法,并且,調(diào)用結(jié)果總是返回實(shí)例:
importjava.lang.reflect.Constructor;
publicclassMain{
publicstaticvoidmain(String[]args)throwsException{
//獲取構(gòu)造方法Integer(int):
Constructorcons1=Integer.class.getConstructor(int.class);
//調(diào)用構(gòu)造方法:
Integern1=(Integer)cons1.newInstance(123);
System.out.println(n1);
//獲取構(gòu)造方法Integer(String)
Constructorcons2=Integer.class.getConstructor(String.class);
Integern2=(Integer)cons2.newInstance("456");
System.out.println(n2);
}
}
通過Class實(shí)例獲取Constructor的方法如下:
getConstructor(Class...):獲取某個(gè)public的Constructor;
getDeclaredConstructor(Class...):獲取某個(gè)Constructor;
getConstructors():獲取所有public的Constructor;
getDeclaredConstructors():獲取所有Constructor。
注意Constructor總是當(dāng)前類定義的構(gòu)造方法,和父類無關(guān),因此不存在多態(tài)的問題。
調(diào)用非public的Constructor時(shí),必須首先通過setAccessible(true)設(shè)置允許訪問。setAccessible(true)可能會(huì)失敗。
小結(jié)
Constructor對(duì)象封裝了構(gòu)造方法的所有信息;
通過Class實(shí)例的方法可以獲取Constructor實(shí)例:getConstructor(),getConstructors(),getDeclaredConstructor(),getDeclaredConstructors();
通過Constructor實(shí)例可以創(chuàng)建一個(gè)實(shí)例對(duì)象:newInstance(Object...parameters);通過設(shè)置setAccessible(true)來訪問非public構(gòu)造方法。
【關(guān)鍵:
通過反射來創(chuàng)建新的實(shí)例:Personp=Person.class.newInstance();
Constructorcons1=Integer.class.getConstructor(int.class);
//調(diào)用構(gòu)造方法:
Integern1=(Integer)cons1.newInstance(123);
注意Constructor總是當(dāng)前類定義的構(gòu)造方法,和父類無關(guān),因此不存在多態(tài)的問題。
通過設(shè)置setAccessible(true)來訪問非public構(gòu)造方法。
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):java調(diào)用構(gòu)造方法”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java基礎(chǔ)學(xué)習(xí)