Java反射

反射

1. 什么是反射沟突?

? 主要是指程序可以訪問汉矿、檢測(cè)和修改它本身狀態(tài)或行為的一種能力

2. Java反射提供了什么能力拜隧?

? 在Java運(yùn)行時(shí)環(huán)境中呻此,對(duì)于任意一個(gè)類轮纫,都知道這個(gè)類有哪些屬性和方法,對(duì)于任意一個(gè)對(duì)象都能調(diào)用它的任意一個(gè)方法焚鲜。具體的能力如下:

  • 1.在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類掌唾。
  • 2.在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象。
  • 3.在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法忿磅。
  • 4.在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法糯彬。

3.反射的作用是什么?

? 反射可以在程序運(yùn)行的時(shí)候葱她,動(dòng)態(tài)修改程序的某些屬性撩扒,使得程序按照我們?cè)O(shè)計(jì)的流程運(yùn)行。大量開源框架都會(huì)用到反射機(jī)制吨些,例如:

  • 騰訊的Tinker熱修復(fù)框架會(huì)反射DexPathList類拿到dexElements變量搓谆,將補(bǔ)丁dex文件放入到dexElements數(shù)組的第一個(gè),讓ClassLoader首先加載已修復(fù)的類豪墅。
  • 360的DroidPlugin等插件化框架會(huì)反射AMS偷梁換柱intent泉手,來繞過AMS對(duì)待啟動(dòng)的Activity是否注冊(cè)Mainifest的驗(yàn)證。
  • ARouter偶器、ButterKnife斩萌、Retrofit、Dagger2等等開源框架都會(huì)通過反射拿到用戶使用注解的類屏轰,然后完成參數(shù)注入或者獲取颊郎。

下面用一張圖來解釋一下反射來實(shí)現(xiàn)Hook的原理:

? 橫軸是程序正常運(yùn)行的時(shí)間軸,我們通過反射機(jī)制在編譯期或者運(yùn)行時(shí)拿到程序中的某個(gè)類霎苗,動(dòng)態(tài)修改該類中的一些屬性姆吭,使程序按照我們期望的點(diǎn)運(yùn)行。該機(jī)制主要還是用于我們無法修改到別人的代碼唁盏,又要借助別人的代碼實(shí)現(xiàn)自己期望的邏輯的場(chǎng)景猾编。

反射圖解.png

4. 反射有什么缺點(diǎn)瘤睹?

? 大量運(yùn)用反射會(huì)導(dǎo)致程序變慢升敲,但是經(jīng)過測(cè)試答倡,一般使用反射的數(shù)量級(jí)在1000以下,幾乎可以忽略影響驴党。那么為什么反射會(huì)導(dǎo)致程序性能變差呢:

  • 在使用反射的過程中會(huì)產(chǎn)生大量的臨時(shí)對(duì)象
  • 虛擬機(jī)在檢查對(duì)象可見性的時(shí)候是會(huì)消耗CPU資源
  • 反射會(huì)生成沒有優(yōu)化的字節(jié)碼
  • 進(jìn)行拆箱瘪撇、裝箱、類型轉(zhuǎn)換的時(shí)候會(huì)消耗資源

5. 如何使用反射港庄?

? 在JDK中主要有以下類來實(shí)現(xiàn)反射機(jī)制倔既,這些(除了第一個(gè))都位于rt.jar的java.lang.reflect包中

  • Class類:代表一個(gè)類,位于java.lang包下鹏氧。
  • Field類:代表類的成員變量(成員變量也稱為類的屬性)渤涌。
  • Method類:代表類的方法。
  • Constructor類:代表類的構(gòu)造方法把还。
  • Array類:提供了動(dòng)態(tài)創(chuàng)建數(shù)組实蓬,以及訪問數(shù)組的元素的靜態(tài)方法。

詳細(xì)API我先用一張圖展示出來吊履,然后一個(gè)一個(gè)闡述用法安皱。

反射.png
5.1 Class類的6種獲取方式
  • 類名.class。 例如: MainActivity.class;

  • 對(duì)象.getClass()艇炎。 例如: View view; view.getClass();

  • Class.forName("全限定名")酌伊。 例如: Class.forName("java.lang.String");

  • 類.class.getClassLoader().loadClass("全限定名")。

    例如: MainActivity.class.getClassLoader().loadClass("java.lang.String");

  • 子類.class.getSuperClass()缀踪。 例如: MainActivity.class.getSuperclass();

  • 包裝類.class居砖。 例如: Integer.class、ContextThemeWrapper.class

5.2 根據(jù)類獲取類名驴娃、全限定名和包名
  • getName() 獲取全限定名奏候。 例如: MainActivity.class.getName()
  • getSimpleName() 獲得類名。例如: MainActivity.class.getSimpleName()
  • getPackage().getName()包名托慨。 例如: MainActivity.class.getPackage().getName()
5.3 獲取變量鼻由、屬性
  • getField("屬性名") 獲取public公共屬性,包括可以獲取父類的
  • getName() 屬性名
  • getModifiers() 修飾符
  • getType() 數(shù)據(jù)類型
  • set(對(duì)象名厚棵,屬性值) 給屬性賦值蕉世。相當(dāng)于 對(duì)象名.set屬性名
  • get(對(duì)象名) 獲取屬性。相當(dāng)于 對(duì)象名.get屬性名
  • getDeclearedField("屬性名") 獲取指定屬性
  • setAccessible(true) 放開private屬性訪問權(quán)
  • getDeclearedFields() 獲取類的全部屬性
5.4 獲取類中的方法
  • getMethod(方法名婆硬,參數(shù)數(shù)據(jù)類型(沒有參數(shù)傳null)) 獲取public方法
  • getDeclearedMethod(方法名狠轻,參數(shù)數(shù)據(jù)類型(沒有參數(shù)傳null)) 獲取類中所有方法
  • invoke(對(duì)象名,參數(shù)列表) 執(zhí)行方法彬犯。相當(dāng)于 對(duì)象名.方法名 如果是靜態(tài)方法對(duì)象名傳入null
  • getParameterTypes() 得到返回參數(shù)列表
  • getDeclearedMethods() 得到類的所有的方法
  • getReturnType() 獲取返回值的數(shù)據(jù)類型
5.5 獲取和調(diào)用構(gòu)造方法
  • Class對(duì)象.getConstructor() 得到構(gòu)造方法
  • Class對(duì)象.getConstructors() 得到所有構(gòu)造方法
  • Class對(duì)象.getDeclaredConstructor 獲取Class類中的構(gòu)造方法
  • newInstance(參數(shù)) 調(diào)用構(gòu)造方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末向楼,一起剝皮案震驚了整個(gè)濱河市查吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湖蜕,老刑警劉巖逻卖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昭抒,居然都是意外死亡评也,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門灭返,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盗迟,“玉大人,你說我怎么就攤上這事熙含》B疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵怎静,是天一觀的道長(zhǎng)邮弹。 經(jīng)常有香客問我,道長(zhǎng)消约,這世上最難降的妖魔是什么肠鲫? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮或粮,結(jié)果婚禮上导饲,老公的妹妹穿的比我還像新娘。我一直安慰自己氯材,他們只是感情好渣锦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氢哮,像睡著了一般袋毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冗尤,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天听盖,我揣著相機(jī)與錄音,去河邊找鬼裂七。 笑死皆看,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的背零。 我是一名探鬼主播腰吟,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼徙瓶!你這毒婦竟也來了毛雇?” 一聲冷哼從身側(cè)響起嫉称,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灵疮,沒想到半個(gè)月后织阅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡始藕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蒲稳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍派。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剩胁,靈堂內(nèi)的尸體忽然破棺而出诉植,到底是詐尸還是另有隱情,我是刑警寧澤昵观,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布晾腔,位于F島的核電站,受9級(jí)特大地震影響啊犬,放射性物質(zhì)發(fā)生泄漏灼擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一觉至、第九天 我趴在偏房一處隱蔽的房頂上張望剔应。 院中可真熱鬧,春花似錦语御、人聲如沸峻贮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纤控。三九已至,卻和暖如春碉纺,著一層夾襖步出監(jiān)牢的瞬間船万,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工骨田, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耿导,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓盛撑,卻偏偏與公主長(zhǎng)得像碎节,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抵卫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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

  • 反射總結(jié)慕課網(wǎng) 反射的視頻 什么是反射 反射是能夠讓java代碼訪問一個(gè)已經(jīng)加載的類的字段狮荔,變量胎撇,方法和構(gòu)造器等信...
    付小影子閱讀 848評(píng)論 0 2
  • 反射(Reflect) 我在java注解文章中, 有提到 RetentionPolicy.RUNTIME, 主要是...
    JeckZyang閱讀 673評(píng)論 0 1
  • 反射概述Reflection(反射)是Java被視為動(dòng)態(tài)語言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflecti...
    nade_s閱讀 259評(píng)論 0 2
  • 思考:在Java運(yùn)行環(huán)境中殖氏,對(duì)于任意一個(gè)類晚树,能否知道這個(gè)類有哪些屬性和方法?對(duì)于任意一個(gè)對(duì)象雅采,能否調(diào)用它的任意一個(gè)...
    風(fēng)_3aa7閱讀 164評(píng)論 0 0
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了巴刻? 不是不允許自己墜落愚铡, 我沒有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,237評(píng)論 0 13