文章均爲本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwalljava
反射:當程序沒法獲知對象類型時,在運行期間動態獲取類的全部屬性和方法,這種動態獲取類信息和動態調用對象方法的功能稱爲反射機制;
反射機制實現:Class類與java.lang.reflect類庫一塊兒實現<反射>機制,
java.lang.reflect類庫包含Field/Method/Constructors類。這些類型的對象由JVM在運行時出建立,分別用於獲取未知類的域/方法/構造器:
經過Class類和java.lang.reflect類包,未知對象的類信息在運行時被肯定,而且在編譯時無需獲取;segmentfault
RTTI,runtime type information/運行時類型信息,JVM運行時負責記錄一個對象的屬性;數組
運行期間,Java經過Class對象記錄每一個對象的RTTI;每當編寫而且編譯一個新類時,就會產生一個對應的Class對象(和新類保存在一個同名的.class文件中)eclipse
類加載器首先檢查類的Class對象是否加載,未加載的話從類的.class文件中加載;.net
一旦類的Class對象被載入內存,它就被用來建立類的全部對象;code
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