天天看點

Java反射 - 通過反射建立有參與無參構造函數的對象

一、問題分析

反射機制 : 指的是程式在運作時能夠擷取自身的資訊。在java中,隻要給定類的名字,那麼就可以通過反射機制來獲得類的所有屬性和方法。

反射可以建立類的對象.

​newInstance()方法​

​​可以建立類的執行個體.那麼擁有該方法除了​

​Class類​

​​之外,還有​

​Constructor類​

​.

可是,Class類中的newInstance()方法隻能建立預設構造器的對象,想要建立有參的構造函數還是要使用Constructor類中的newInstance(Object … initargs)方法.

那麼如何擷取Class類對象呢?如何擷取Constructor類對象呢?

二、擷取Class類對象

擷取該類對象的方式有三種.對象.
  1. 對象.getClass()
  2. Class.forName(全限定類名);
  3. 類名.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)

這個方法傳回的是上面那個方法傳回結果的子集,​

​隻傳回指定參數類型通路權限是public的構造器。​

​ getConstructors()的傳回結果同樣也沒有參數類型的過濾。傳回類的所有公共構造函數。

知道兩個方法的差別之後,就可以根據構造器的修飾符比對調用哪個方法.(如果建立有參構造函數的對象時,需要在調用方法的參數依照構造器的類型順序寫上​

​類型.class​

​)

調用該方法,将會傳回​

​Constructor類對象​

​​,那麼就可以調用​

​newInstance(Object ... initargs)方法​

​,參數傳入想要傳入對應構造器相應類型的參數即可.建立完成.

四、執行個體示範

  1. ​​Java反射 - [執行個體示範] 建立類的對象多種方式​​
  2. ​​Java反射 - 建立數組執行個體​​

五、可能出現的問題

繼續閱讀