一则拷、簡介
Java在編譯時(shí)候就必須知道所引用的類所在地方煌茬,但是在實(shí)際編程中坛善,在某些場(chǎng)合浑吟,可能需要引用一個(gè)并不在編譯空間的類组力,這個(gè)時(shí)候常規(guī)方法就很難實(shí)現(xiàn)了燎字。在Java中笼蛛,Class配合反射能夠很好的解決這種場(chǎng)景滨砍。Java里面的反射可以幫助我們?cè)谶\(yùn)行程序時(shí)候加載惋戏、使用編譯期間完全未知的class响逢,簡單來說就是Java可以加載一個(gè)運(yùn)行時(shí)候才得知名稱的class舔亭,獲得其完整的構(gòu)造钦铺,并生成實(shí)例化對(duì)象,對(duì)其成員變量賦值缚甩,調(diào)用其方法等等窑邦。
二郊丛、說明?
反射機(jī)制中會(huì)用到一些類厉熟,在了解反射是如何使用之前揍瑟,先介紹一下這些類乍炉。
Class在反射中表示內(nèi)存中的一個(gè)Java類,Class可以代表的實(shí)例類型包括巢株,類和接口阁苞、基本數(shù)據(jù)類型、數(shù)組
ObjectJava中所有類的超類
Constructor封裝了類的構(gòu)造函數(shù)的屬性信息,包括訪問權(quán)限和動(dòng)態(tài)調(diào)用信息
Field提供類或接口的成員變量屬性信息软瞎,包括訪問權(quán)限和動(dòng)態(tài)修改
Method提供類或接口的方法屬性信息,包括訪問權(quán)限和動(dòng)態(tài)調(diào)用信息
Modifier封裝了修飾屬性魔慷, public蜻展、protected纵顾、static施逾、final、synchronized蠕搜、abstract等讥脐。
三旬渠、獲取屬性
1枪蘑、基類或者接口
最基本的,可以通過反射岖免,來獲取一個(gè)類的基類或者實(shí)現(xiàn)的接口话侧,使用getSuperclass()或者該類的基類瞻鹏,使用getInterfaces()來獲取該類實(shí)現(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()方法來獲取類中定義的方法。直接看一下這二個(gè)方法執(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)四種方法楷力。
四個(gè)方法的具體區(qū)別:
-getFields()? ?獲取類的所有public屬性的成員變量检柬,包括繼承類和基類
-getDeclaredFields()? ?獲取類的所有成員變量(不包含父類和基類等)
-getMethod(name, params)根據(jù)參數(shù)在getFields()獲取的成員變量中進(jìn)行篩選
-getDeclaredMethod(name, params)根據(jù)參數(shù)在getDeclaredFields()獲取的成員變量中進(jìn)行篩選