一、問題分析
反射機制 : 指的是程式在運作時能夠擷取自身的資訊。在java中,隻要給定類的名字,那麼就可以通過反射機制來獲得類的所有屬性和方法。
反射可以建立類的對象.
newInstance()方法
可以建立類的執行個體.那麼擁有該方法除了
Class類
之外,還有
Constructor類
.
可是,Class類中的newInstance()方法隻能建立預設構造器的對象,想要建立有參的構造函數還是要使用Constructor類中的newInstance(Object … initargs)方法.
那麼如何擷取Class類對象呢?如何擷取Constructor類對象呢?
二、擷取Class類對象
擷取該類對象的方式有三種.對象.
- 對象.getClass()
- Class.forName(全限定類名);
- 類名.class
擷取數組的Class類對象.
int[].class 或者 Class.forName("[I");
String數組擷取方式還可以`Class.forName("[Ljava.lang.String;");
1.getClass()方法是Object類中的方法,Object類是所有類的父類,所有建立的對象都有該方法.
2.隻要擷取了類的全限定名,就可以通過
Class.forName(String)
的形式來擷取Class對象
3.
類型.class
是一個Class類型的對象.且類型不一定是類,例如,int.
擷取了Class類對象後,就可以直接調用
newInstance()方法
來建立該類的對象.
Note : Class類中的newInstance()方法隻能建立無參構造函數的對象.
三、擷取Constructor類對象
先擷取Class類對象後,可以調用
getConstructor(Class<?>... parameterTypes)方法
和
getDeclaredConstructor(Class<?>... parameterTypes)方法
這兩個方法的差別是什麼呢?getDeclaredConstructor()與getConstructor的差別
首先看getDeclaredConstructor(Class<?>… parameterTypes)
這個方法會傳回指定參數類或接口的構造器,
包括public的和非public的,當然也包括private的。
getDeclaredConstructors()的傳回結果就沒有參數類型的過濾了,傳回類聲明的所有構造函數的 Constructor對象的數組。
再來看getConstructor(Class<?>… parameterTypes)
這個方法傳回的是上面那個方法傳回結果的子集,
getConstructors()的傳回結果同樣也沒有參數類型的過濾。傳回類的所有公共構造函數。
隻傳回指定參數類型通路權限是public的構造器。
知道兩個方法的差別之後,就可以根據構造器的修飾符比對調用哪個方法.(如果建立有參構造函數的對象時,需要在調用方法的參數依照構造器的類型順序寫上
類型.class
)
調用該方法,将會傳回
Constructor類對象
,那麼就可以調用
newInstance(Object ... initargs)方法
,參數傳入想要傳入對應構造器相應類型的參數即可.建立完成.
四、執行個體示範
- Java反射 - [執行個體示範] 建立類的對象多種方式
- Java反射 - 建立數組執行個體