反射機制與原理筆記

反射機制與原理筆記

聲明

文章均爲本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwalljava


反射機制

反射:當程序沒法獲知對象類型時,在運行期間動態獲取類的全部屬性和方法,這種動態獲取類信息和動態調用對象方法的功能稱爲反射機制;
反射機制實現:Class類與java.lang.reflect類庫一塊兒實現<反射>機制,
java.lang.reflect類庫包含Field/Method/Constructors類。這些類型的對象由JVM在運行時出建立,分別用於獲取未知類的域/方法/構造器:
經過Class類和java.lang.reflect類包,未知對象的類信息在運行時被肯定,而且在編譯時無需獲取;segmentfault

RTTI與java.lang.Class類

RTTI,runtime type information/運行時類型信息,JVM運行時負責記錄一個對象的屬性;數組

運行期間,Java經過Class對象記錄每一個對象的RTTI每當編寫而且編譯一個新類時,就會產生一個對應的Class對象(和新類保存在一個同名的.class文件中)eclipse

JVM經過類加載器建立類的對象實例

  • 類加載器首先檢查類的Class對象是否加載,未加載的話從類的.class文件中加載;.net

  • 一旦類的Class對象被載入內存,它就被用來建立類的全部對象;code

java.lang.reflect類

reflect包提供如下類供反射使用,解析目標類:orm

  • Class類:表明一個目標類;對象

  • Field類:表明目標類的成員變量;blog

  • Method類:表明目標類的方法。繼承

  • Constructor類:表明目標類的構造方法。

  • Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法;


反射步驟

得到目標類的java.lang.Class對象

已得到目標類對象實例

// Object類
public final native Class<?> getClass();

若是已得到目標類對象實例,經過目標類對象實例.getClass()返回該類Class對象;

已得到目標類名

假設目標類名爲myClass, 經過Class c = myClass.getClass()得到該類Class對象;

目標類名在編譯器不肯定,在運行期肯定

若是目標類名在編譯器不肯定,在運行期能夠肯定,使用Class.forName(目標類名)獲取該類Class對象,要求目標類名必須是全限定
Class.forName(目標類名)內部經過反射API根據目標類名將類手動加載到內存中,稱爲類加載器加載方法。加載過程當中會把目標類的static方法,變量,代碼塊加載到JVM,注意此時還沒有建立對象實例;

利用java.lang.Class對象經過反射API獲取目標類信息

建立目標類對象實例

Object newInstance():經過調用默認構造器建立一個對象實例,

反射機制只能調用無參的構造器建立對象;

得到構造器

  • Constructor[] getConstructors():得到全部public構造器;

  • Constructor[] getDeclaredConstructors():得到全部訪問權限的構造器

  • Constructor getConstructor(Class[] params):根據指定參數得到對應構造器;

  • Constructor getDeclaredConstructor(Class[] params):根據指定參數得到對應構造器;

得到方法

  • Method[] getMethods():得到全部public方法;

  • Method[] getDeclaredMethods():得到全部訪問權限的方法;

  • Method getMethod(String name, Class[] params):根據方法簽名獲取類自身對應public方法,或者從基類繼承和接口實現的對應public方法

  • Method getDeclaredMethod(String name, Class[] params):根據方法簽名得到對應的類自身聲明方法訪問權限不限

得到變量

  • Field[] getFields():得到類中全部public變量

  • Field[] getDeclaredFields():得到類中全部訪問權限變量

  • Field getField(String name):根據變量名獲得對應的public變量

  • Field getDeclaredField(String name):根據變量名得到對應的變量,訪問權限不限


反射應用

  • 普遍應用於對象序列化和JavaBean中;

  • eclipse等IDE補全機制:eclipse等IDE在代碼構建對象時,經過反射機制自動把該對象能使用的方法和屬性所有列出來,供用戶選擇;


參考

[1] http://blog.csdn.net/jojo52013145/article/details/5801962

相關文章
相關標籤/搜索