一、簡介
Java在編譯時候就必須知道所引用的類所在地方,但是在實際編程中,在某些場合,可能需要引用一個并不在編譯空間的類,這個時候常規(guī)方法就很難實現(xiàn)了。在Java中,Class配合反射能夠很好的解決這種場景。Java里面的反射可以幫助我們在運行程序時候加載、使用編譯期間完全未知的class,簡單來說就是Java可以加載一個運行時候才得知名稱的class,獲得其完整的構(gòu)造,并生成實例化對象,對其成員變量賦值,調(diào)用其方法等等。
二、說明?
反射機制中會用到一些類,在了解反射是如何使用之前,先介紹一下這些類。
Class在反射中表示內(nèi)存中的一個Java類,Class可以代表的實例類型包括,類和接口、基本數(shù)據(jù)類型、數(shù)組
ObjectJava中所有類的超類
Constructor封裝了類的構(gòu)造函數(shù)的屬性信息,包括訪問權(quán)限和動態(tài)調(diào)用信息
Field提供類或接口的成員變量屬性信息,包括訪問權(quán)限和動態(tài)修改
Method提供類或接口的方法屬性信息,包括訪問權(quán)限和動態(tài)調(diào)用信息
Modifier封裝了修飾屬性, public、protected、static、final、synchronized、abstract等。
三、獲取屬性
1、基類或者接口
最基本的,可以通過反射,來獲取一個類的基類或者實現(xiàn)的接口,使用getSuperclass()或者該類的基類,使用getInterfaces()來獲取該類實現(xiàn)的接口。直接看一下例子。

2、構(gòu)造函數(shù)
直接上代碼:

getConstructors():獲取的構(gòu)造函數(shù)全部是public屬性的,不包含父類。
getConstuctor(Class … params):根據(jù)參數(shù),從所有public屬性的構(gòu)造函數(shù)中獲取相關(guān)構(gòu)造函數(shù)。
getDeclaredConstructors():獲取所有的構(gòu)造函數(shù),不包含父類
getDelaredConstructor(Class … params):根據(jù)參數(shù),從所有的構(gòu)造函數(shù)中獲取相關(guān)構(gòu)造函數(shù)。 不包含父類。
3、方法
在Java中,一般通過getMethods()或者getDeclaredMethod()方法來獲取類中定義的方法。直接看一下這二個方法執(zhí)行的例子。

-getMethods()??返回類中所有的public屬性的方法,包括從基類繼承的public方法。
-getDeclaredMethods()??返回類本身聲明的方法,包括復(fù)寫的方法,不包括從基類繼承的方法
-getMethod(name,params)根據(jù)參數(shù)從getMethods()返回的結(jié)果中篩選
-getDeclaredMethod(name, params)根據(jù)參數(shù)從getDeclaredMethods()返回的結(jié)果中篩選
4、成員變量
成員變量獲取和上面類似,主要方法有g(shù)etFields()、getDeclaredFields()、getMethod(name, params)、getDeclaredMethod(name, params)四種方法。

四個方法的具體區(qū)別:
-getFields()? ?獲取類的所有public屬性的成員變量,包括繼承類和基類
-getDeclaredFields()? ?獲取類的所有成員變量(不包含父類和基類等)
-getMethod(name, params)根據(jù)參數(shù)在getFields()獲取的成員變量中進行篩選
-getDeclaredMethod(name, params)根據(jù)參數(shù)在getDeclaredFields()獲取的成員變量中進行篩選