學(xué)習(xí)Java反射類(lèi)

一申窘、基本定義

通常情況下編寫(xiě)代碼都是固定的婶希,無(wú)論運(yùn)行多少次執(zhí)行的結(jié)果也是固定的耕腾,在某些特殊場(chǎng)合中編寫(xiě) 代碼時(shí)不確定要?jiǎng)?chuàng)建什么類(lèi)型的對(duì)象见剩,也不確定要調(diào)用什么樣的方法,這些都希望通過(guò)運(yùn)行時(shí)傳遞的參數(shù)來(lái)決定扫俺,該機(jī)制叫做動(dòng)態(tài)編程技術(shù)苍苞,也就是反射機(jī)制。 通俗來(lái)說(shuō)牵舵,反射機(jī)制就是用于動(dòng)態(tài)創(chuàng)建對(duì)象并且動(dòng)態(tài)調(diào)用方法的機(jī)制。 目前主流的框架底層都是采用反射機(jī)制實(shí)現(xiàn)的倦挂。

如:
Person p = new Person(); - 表示聲明Person類(lèi)型的引用指向Person類(lèi)型的對(duì)象 p.show(); - 表示調(diào)用Person類(lèi)中的成員方法show

二畸颅、Class類(lèi)

基本概念

java.lang.Class類(lèi)的實(shí)例可以用于描述Java應(yīng)用程序中的類(lèi)和接口,也就是一種數(shù)據(jù)類(lèi)型方援。 該類(lèi)沒(méi)有公共構(gòu)造方法没炒,該類(lèi)的實(shí)例由Java虛擬機(jī)和類(lèi)加載器自動(dòng)構(gòu)造完成,本質(zhì)上就是加載到內(nèi) 存中的運(yùn)行時(shí)類(lèi)犯戏。

獲取Class對(duì)象的方法(重點(diǎn))

  1. 使用數(shù)據(jù)類(lèi)型.class的方式可以獲取對(duì)應(yīng)類(lèi)型的Class對(duì)象(掌握)送火。
  2. 使用Class.forName()的方式來(lái)獲取參數(shù)指定類(lèi)型的Class對(duì)象(掌握)。
  3. 使用引用/對(duì)象.getClass()的方式可以獲取對(duì)應(yīng)類(lèi)型的Class對(duì)象先匪。
  4. 使用包裝類(lèi).TYPE的方式可以獲取對(duì)應(yīng)基本數(shù)據(jù)類(lèi)型的Class對(duì)象种吸。
  5. 使用類(lèi)加載器ClassLoader的方式獲取指定類(lèi)型的Class對(duì)象。

常用的方法

方法聲明 功能介紹
static Class<?> forName(String className) 用于獲取參數(shù)指定類(lèi)型對(duì)應(yīng)的Class對(duì)象并返回
T newInstance() 用于創(chuàng)建該Class對(duì)象所表示類(lèi)的新實(shí)例

Class類(lèi)的常用方法

方法聲明 功能介紹
Constructor getConstructor(Class<?>... parameterTypes) 用于獲取此Class對(duì)象所表示類(lèi)型中參數(shù)指定的 parameterTypes)
Constructor<?>[] getConstructors() 用于獲取此Class對(duì)象所表示類(lèi)型中所有的公共 構(gòu)造方法(重要)

Constructor類(lèi)

java.lang.reflect.Constructor類(lèi)主要用于描述獲取到的構(gòu)造方法信息

Constructor類(lèi)的常用方法

方法聲明 功能介紹
T newInstance(Object... initargs) 使用此Constructor對(duì)象描述的構(gòu)造方法來(lái)構(gòu)造Class對(duì)象代表類(lèi) 型的新實(shí)例
int getModifiers() 獲取方法的訪問(wèn)修飾符
String getName() 獲取方法的名稱(chēng)
Class<?>[] getParameterTypes() 獲取方法所有參數(shù)的類(lèi)型

三呀非、Field類(lèi)

基本概念

java.lang.reflect.Field類(lèi)主要用于描述獲取到的單個(gè)成員變量信息坚俗。

Class類(lèi)的常用方法

方法聲明 功能介紹
Field getDeclaredField(String name) 用于獲取此Class對(duì)象所表示類(lèi)中參數(shù)指定的單個(gè)成員變量信息
Field[] getDeclaredFields() 用于獲取此Class對(duì)象所表示類(lèi)中所有成員變量信息

getField和getDeclaredField的區(qū)別

getField 只能獲取public的,包括從父類(lèi)繼承來(lái)的字段岸裙。getDeclaredField 可以獲取本類(lèi)所有的字段猖败,包括private的,但是不能獲取繼承來(lái)的字段降允。 (注: 這里只能獲取到private的字段恩闻,但并不能訪問(wèn)該private字段的值,除非加上setAccessible(true))

Field類(lèi)的常用方法

方法聲明 功能介紹
Object get(Object obj) 獲取參數(shù)對(duì)象obj中此Field對(duì)象所表示成員變量的數(shù)值(重要)
void set(Object obj, Object value) 將參數(shù)對(duì)象obj中此Field對(duì)象表示成員變量的數(shù)值修改為參數(shù), value的數(shù)值
void setAccessible(boolean flag) 當(dāng)實(shí)參傳遞true時(shí),則反射對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪 問(wèn)檢查
int getModifiers() 獲取成員變量的訪問(wèn)修飾符
Class<?> getType() 獲取成員變量的數(shù)據(jù)類(lèi)型
String getName() 獲取成員變量的名稱(chēng)

四剧董、Method類(lèi)

基本概念

java.lang.reflect.Method類(lèi)主要用于描述獲取到的單個(gè)成員方法信息幢尚。

Class類(lèi)的常用方法

方法聲明 功能介紹
Method getMethod(String name, Class<?>... parameterTypes) 用于獲取該Class對(duì)象表示類(lèi)中名字為name參數(shù)為 parameterTypes的指定公共成員方法
Method[] getMethods() 用于獲取該Class對(duì)象表示類(lèi)中所有公共成員方法

Method類(lèi)的常用方法

方法聲明 功能介紹
Object invoke(Object obj, Object... args) 使用對(duì)象obj來(lái)調(diào)用此Method對(duì)象所表示的成員方法,實(shí) 參傳遞args
int getModifiers() 獲取方法的訪問(wèn)修飾符
Class<?> getReturnType() 獲取方法的返回值類(lèi)型
String getName() 獲取方法的名稱(chēng)
Class<?>[] getParameterTypes() 獲取方法所有參數(shù)的類(lèi)型
Class<?>[] getExceptionTypes() 獲取方法的異常信息

獲取其它結(jié)構(gòu)信息

方法聲明 功能介紹
Package getPackage() 獲取所在的包信息
Class<? super T> getSuperclass() 獲取繼承的父類(lèi)信息
Class<?>[] getInterfaces() 獲取實(shí)現(xiàn)的所有接口
Annotation[] getAnnotations() 獲取注解信息
Type[] getGenericInterfaces() 獲取泛型信息
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翅楼,一起剝皮案震驚了整個(gè)濱河市侠草,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犁嗅,老刑警劉巖边涕,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡功蜓,警方通過(guò)查閱死者的電腦和手機(jī)园爷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)式撼,“玉大人童社,你說(shuō)我怎么就攤上這事≈。” “怎么了扰楼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)美浦。 經(jīng)常有香客問(wèn)我弦赖,道長(zhǎng),這世上最難降的妖魔是什么浦辨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任蹬竖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己盗尸,他們只是感情好兔毙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上同辣,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音惭载,去河邊找鬼旱函。 笑死,一個(gè)胖子當(dāng)著我的面吹牛描滔,可吹牛的內(nèi)容都是我干的棒妨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼含长,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼券腔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拘泞,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纷纫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后陪腌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辱魁,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烟瞧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了染簇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参滴。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锻弓,靈堂內(nèi)的尸體忽然破棺而出砾赔,到底是詐尸還是另有隱情,我是刑警寧澤青灼,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布暴心,位于F島的核電站,受9級(jí)特大地震影響杂拨,放射性物質(zhì)發(fā)生泄漏专普。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一扳躬、第九天 我趴在偏房一處隱蔽的房頂上張望脆诉。 院中可真熱鬧甚亭,春花似錦贷币、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至暇唾,卻和暖如春促脉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背策州。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瘸味, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人够挂。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓旁仿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親孽糖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枯冈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容