反射

https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650825931&idx=1&sn=b61ed2ad2665cbc3a89351b161223769&chksm=80b7b055b7c03943f10f1e8b3697d3d33bbfc98d38e40c9ecbc6a3ab34f700a065858f8c8ce9&scene=38#wechat_redirect

在計(jì)算機(jī)科學(xué)中膘壶,反射是指計(jì)算機(jī)程序在運(yùn)行時(shí)(Run time)可以訪問春畔、檢測和修改它本身狀態(tài)或行為的一種能力拌牲。[1]用比喻來說,反射就是程序在運(yùn)行的時(shí)候能夠“觀察”并且修改自己的行為驻啤。

Java 反射主要提供以下功能:

在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象喉恋;
在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法);
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法

// 即以下方法都屬于Class 類的方法梭域。

<-- 1. 獲取類的構(gòu)造函數(shù)(傳入構(gòu)造函數(shù)的參數(shù)類型)->>
// a. 獲取指定的構(gòu)造函數(shù) (公共 / 繼承)
Constructor<T> getConstructor(Class<?>... parameterTypes)
// b. 獲取所有的構(gòu)造函數(shù)(公共 / 繼承)
Constructor<?>[] getConstructors();
// c. 獲取指定的構(gòu)造函數(shù) ( 不包括繼承)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
// d. 獲取所有的構(gòu)造函數(shù)( 不包括繼承)
Constructor<?>[] getDeclaredConstructors();
// 最終都是獲得一個(gè)Constructor類對(duì)象

// 特別注意:
// 1. 不帶 "Declared"的方法支持取出包括繼承、公有(Public) & 不包括有(Private)的構(gòu)造函數(shù)
// 2. 帶 "Declared"的方法是支持取出包括公共(Public)搅轿、保護(hù)(Protected)病涨、默認(rèn)(包)訪問和私有(Private)的構(gòu)造方法,但不包括繼承的構(gòu)造函數(shù)
// 下面同理

<-- 2. 獲取類的屬性(傳入屬性名) -->
// a. 獲取指定的屬性(公共 / 繼承)
Field getField(String name) ;
// b. 獲取所有的屬性(公共 / 繼承)
Field[] getFields() ;
// c. 獲取指定的所有屬性 (不包括繼承)
Field getDeclaredField(String name) 璧坟;
// d. 獲取所有的所有屬性 (不包括繼承)
Field[] getDeclaredFields() 既穆;
// 最終都是獲得一個(gè)Field類對(duì)象

<-- 3. 獲取類的方法(傳入方法名 & 參數(shù)類型)-->
// a. 獲取指定的方法(公共 / 繼承)
Method getMethod(String name, Class<?>... parameterTypes) ;
// b. 獲取所有的方法(公共 / 繼承)
Method[] getMethods() 雀鹃;
// c. 獲取指定的方法 ( 不包括繼承)
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 幻工;
// d. 獲取所有的方法( 不包括繼承)
Method[] getDeclaredMethods() ;
// 最終都是獲得一個(gè)Method類對(duì)象

<-- 4. Class類的其他常用方法 -->
getSuperclass();
// 返回父類

String getName();
// 作用:返回完整的類名(含包名黎茎,如java.lang.String )

Object newInstance();
// 作用:快速地創(chuàng)建一個(gè)類的實(shí)例
// 具體過程:調(diào)用默認(rèn)構(gòu)造器(若該類無默認(rèn)構(gòu)造器会钝,則拋出異常
// 注:若需要為構(gòu)造器提供參數(shù)需使用java.lang.reflect.Constructor中的newInstance()
通過 Class 對(duì)象分別獲取Constructor類對(duì)象、Method類對(duì)象 & Field 類對(duì)象
Class<?> serviceManager = null;
try {
serviceManager = Class.forName("android.os.ServiceManager");
System.out.println(serviceManager);
//獲取方法
Method getService = serviceManager.getMethod("getService", String.class);
//調(diào)用方法
IBinder iBinder = (IBinder) getService.invoke(serviceManager.newInstance(), "InputService");
System.out.println(iBinder);
} catch (Exception e) {
e.printStackTrace();
}

getDeclaredMethod*()獲取的是類自身聲明的所有方法工三,包含public、protected和private方法先鱼。

getMethod*()獲取的是類的所有共有方法俭正,這就包括自身的所有public方法,和從基類繼承的焙畔、從接口實(shí)現(xiàn)的所有public方法掸读。

小技巧 :getDeclaredMethods的效率高,但是只能查詢自身的類方法宏多,如果沒找到可以再次嘗試getMethods()獲得

如下參考EventBus中 SubscriberMethodFinder.java部分片段:
try {
// This is faster than getMethods, especially when subscribers are fat classes like Activities
methods = findState.clazz.getDeclaredMethods();
} catch (Throwable th) {
// Workaround for java.lang.NoClassDefFoundError, see https://github.com/greenrobot/EventBus/issues/149
methods = findState.clazz.getMethods();
findState.skipSuperClasses = true;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿惫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伸但,更是在濱河造成了極大的恐慌肾请,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更胖,死亡現(xiàn)場離奇詭異铛铁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)却妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門饵逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夷家,你說我怎么就攤上這事记盒”炫拢” “怎么了赎瑰?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵薄声,是天一觀的道長当船。 經(jīng)常有香客問我,道長奸柬,這世上最難降的妖魔是什么生年? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮廓奕,結(jié)果婚禮上抱婉,老公的妹妹穿的比我還像新娘。我一直安慰自己桌粉,他們只是感情好蒸绩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铃肯,像睡著了一般患亿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上押逼,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天步藕,我揣著相機(jī)與錄音,去河邊找鬼挑格。 笑死咙冗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漂彤。 我是一名探鬼主播雾消,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挫望!你這毒婦竟也來了立润?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤媳板,失蹤者是張志新(化名)和其女友劉穎桑腮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉幸,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡到旦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巨缘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添忘。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖若锁,靈堂內(nèi)的尸體忽然破棺而出搁骑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布仲器,位于F島的核電站煤率,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乏冀。R本人自食惡果不足惜蝶糯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辆沦。 院中可真熱鬧昼捍,春花似錦、人聲如沸肢扯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚晨。三九已至乍钻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铭腕,已是汗流浹背银择。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留累舷,地道東北人欢摄。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像笋粟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子析蝴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 課程地址:Java基礎(chǔ)之 — 反射(非常重要) (使用的前提條件:必須先得到代表的字節(jié)碼的Class害捕,Cla...
    叨唧唧的閱讀 686評(píng)論 0 2
  • 一、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中闷畸,對(duì)于任意一個(gè)類尝盼,都能夠知道這個(gè)類中的所有屬性和方法...
    CoderZS閱讀 1,634評(píng)論 0 26
  • (轉(zhuǎn)自csdn) 反射是框架設(shè)計(jì)的靈魂 (使用的前提條件:必須先得到代表的字節(jié)碼的Class,Class類用于表示...
    尼爾君閱讀 227評(píng)論 0 1
  • 西門街往事 目錄 【連載】西門街往事(二十一)故人歸來 第二十二章 假如我不曾離去 走出地鐵口佑菩,看著道路兩旁的商...
    苙回閱讀 410評(píng)論 1 3
  • 第一次來合肥是九十年代的夏天盾沫,那時(shí)我才七歲,記憶里的些許片段拼不出這座城市的清晰印象殿漠。 十年前赴精,仰望晴空,廣播里绞幌,...
    話木閱讀 311評(píng)論 0 0