Android反射機(jī)制

Android反射相關(guān)知識(shí)匯總

一睦擂、什么是反射機(jī)制?

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中选浑,對于任意一個(gè)類蓝厌,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象古徒,都能夠調(diào)用它的任意方法和屬性拓提;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對象方法的功能稱為Java語言的反射機(jī)制。

官方文檔上介紹:反射技術(shù)通常被用來檢測和改變應(yīng)用程序在Java虛擬機(jī)中的行為表現(xiàn)隧膘。它是一個(gè)相對而言比較高級的技術(shù)代态,通常它應(yīng)用的前提是開發(fā)者本身對于Java語言特性有很強(qiáng)的理解的基礎(chǔ)上寺惫。反射是一種強(qiáng)有力的技術(shù)特性,因此可以使得應(yīng)用程序突破一些無法企及的目的蹦疑。

二西雀、我們需要知道哪些理論基礎(chǔ)?

  • Class:Class對象是一個(gè)特殊的對象歉摧,是用來創(chuàng)建其它Java的實(shí)例艇肴,Class對象就是Java類編譯后生成的.class文件,它包含了與類有關(guān)的信息叁温。

  • Field:Filed字段提供有關(guān)和動(dòng)態(tài)訪問的信息再悼,類或接口的單個(gè)字段。反射的字段可能是類字段或?qū)嵗侄巍?/h4>

  • Method:Method方法提供了關(guān)于單個(gè)方法的信息和訪問在類或接口上膝但。反射的方法可能是類方法或者是一個(gè)實(shí)例方法(包括一個(gè)抽象的方法)冲九。

  • Constructor:Constructor提供了關(guān)于某類的構(gòu)造方法的所需信息。

三跟束、我們需要掌握哪些方法呢莺奸?

  • 獲取Class對象的幾個(gè)方法:

  1、類名.class; 不執(zhí)行靜態(tài)塊和動(dòng)態(tài)構(gòu)造塊泳炉。
  2憾筏、Class.forName(path); 執(zhí)行靜態(tài)塊,不執(zhí)行動(dòng)態(tài)構(gòu)造塊花鹅。
  3氧腰、對象.getClass(); 需要?jiǎng)?chuàng)建對象,靜態(tài)塊和動(dòng)態(tài)構(gòu)造塊均會(huì)執(zhí)行刨肃。
  • 獲取類屬性Field的幾個(gè)方法:

  1古拴、class.getField(fieldName); 只能獲取public修飾的字段
  2、class.getFields(); 獲取所有public修飾的字段的Field數(shù)組
  3真友、class.getDeclaredField(fieldName); 可以獲得所有字段
  4黄痪、class.getDeclaredFields(); 獲取所有字段的Field數(shù)組
  • 獲取類方法Method的幾個(gè)方法:

  1、class.getMethod(methodName); 只能獲取public修飾的方法名稱
  2盔然、class.getMethods(); 獲取所有public修飾的方法的Method數(shù)組
  3桅打、class.getDeclaredMethod(methodName); 可以獲得所有方法
  4、class.getDeclaredMethods(); 獲取所有方法的Method數(shù)組
  • 獲取構(gòu)造函數(shù)Constructor的幾個(gè)方法:

  1愈案、class.getConstructor(methodName); 只能獲取public修飾的方法名稱
  2挺尾、class.getConstructors(); 獲取所有public修飾的方法的Method數(shù)組
  3、class.getDeclaredConstructor(methodName); 可以獲得所有方法
  4站绪、class.getDeclaredConstructors(); 獲取所有方法的Method數(shù)組
  • 創(chuàng)建對象的方法

  1遭铺、Constructor.newInstance(可變參數(shù));
  eg:Persion p = (Persion)constructor.newInstance("1");
  • 設(shè)置屬性值

(1) field.set(Objkect obj,Object value);
(2) field.setInt(Objkect obj,int value);
...
(n) file.setLong(Objkect obj,long value);
  • 獲取屬性對象

(1) field.get(Object);
eg:Person p = (Persion)filed.get(對象);
  • 調(diào)用方法

這里必須注意的是當(dāng)操作的對象用private修飾的時(shí)候需要用method.setAccessible(true)來設(shè)置可以訪問到.
然后調(diào)用method.invoke(Object obj,參數(shù)),這個(gè)Object的對象必須是該類的對象.不是所謂的類對象.

四.Android能用到的地方

  • 修改TabLayout的下劃線的長度.對于TabLayout的使用這里就不必多說了,系統(tǒng)只提供了修改下劃線的高度和顏色的方法,并沒有修改長度的方法.這里就要用到反射區(qū)獲取TabLayout內(nèi)部控制長度的方法.這里只能通過設(shè)置每個(gè)Tab的Margin來控制下劃線的寬度,有可能出現(xiàn)Tab的文字被擠壓的情況,只能將就使用了.代碼如下:

Class<? extends TabLayout> tabClass = tabLayout.getClass();
     try {
         Field mTabStrip = tabClass.getDeclaredField("mTabStrip");
         mTabStrip.setAccessible(true);
        LinearLayout linearLayout = (LinearLayout) mTabStrip.get(tabLayout);
         for (int i = 0; i < linearLayout.getChildCount(); i++) {
             View child = linearLayout.getChildAt(i);
             child.setPadding(0,0,0,0);
             LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) child.getLayoutParams();
            // layoutParams.width = 300;
             layoutParams.leftMargin = 150;
             layoutParams.rightMargin = 150;
             child.setLayoutParams(layoutParams);
             child.invalidate();
         }
     } catch (NoSuchFieldException e) {
         e.printStackTrace();
     } catch (IllegalAccessException e) {
         e.printStackTrace();
     }
  • 控制Toast的顯示時(shí)間.Toast內(nèi)部類TN的設(shè)置顯示時(shí)間的代碼:

這里系統(tǒng)自帶的Toast只給了我們兩個(gè)時(shí)間的選擇SHORT_DURATION_TIMEOUT和LONG_DURATION_TIMEOUT其他的我們沒法改變.還好系統(tǒng)提供了hide方法不過在外面我們是訪問不到,這里我們也可以用到反射,大部分的操作都是Toast的內(nèi)部類TN來完成的.首先獲取到Toast的class對象,Toast內(nèi)部含有內(nèi)部類的字段(final TN mTN),這樣我們可以獲取到內(nèi)部類的對象,然后再通過內(nèi)部類的Class對象來獲取內(nèi)部類里面的hide()方法.代碼如下:

mParams.hideTimeoutMilliseconds = mDuration ==
  Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT;
               ...
  /**
    * schedule handleHide into the right thread
    */
   @Override
   public void hide() {
       if (localLOGV) Log.v(TAG, "HIDE: " + this);
       mHandler.obtainMessage(HIDE).sendToTarget();
   }
  try{
       Class<Toast> toastClass = Toast.class;
       Field mTN = toastClass.getDeclaredField("mTN");
       //獲取修飾符類型
       toastClass.getModifiers();
       mTN.setAccessible(true);
       Object o = mTN.get(toast);
       Class<?> aClass = o.getClass();
       Method hide = aClass.getDeclaredMethod("hide");
       hide.setAccessible(true);
       hide.invoke(o);
   } catch (NoSuchFieldException e) {
       e.printStackTrace();
   } catch (IllegalAccessException e) {
       e.printStackTrace();
   } catch (InvocationTargetException e) {
       e.printStackTrace();
   } catch (NoSuchMethodException e) {
       e.printStackTrace();
   }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子魂挂,更是在濱河造成了極大的恐慌甫题,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涂召,死亡現(xiàn)場離奇詭異坠非,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芹扭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門麻顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舱卡,你說我怎么就攤上這事辅肾。” “怎么了轮锥?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵矫钓,是天一觀的道長。 經(jīng)常有香客問我舍杜,道長新娜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任既绩,我火速辦了婚禮概龄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饲握。我一直安慰自己私杜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布救欧。 她就那樣靜靜地躺著衰粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆怠。 梳的紋絲不亂的頭發(fā)上铝耻,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音蹬刷,去河邊找鬼瓢捉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛办成,可吹牛的內(nèi)容都是我干的泊柬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼诈火,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冷守,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刀崖,失蹤者是張志新(化名)和其女友劉穎拍摇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜂莉,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幕随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了走诞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣旱。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖位隶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笋妥,我是刑警寧澤春宣,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站簿姨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏域仇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝠检。 院中可真熱鬧叹谁,春花似錦焰檩、人聲如沸析苫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涂身,卻和暖如春丁鹉,著一層夾襖步出監(jiān)牢的瞬間妒潭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工揣钦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雳灾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓冯凹,卻偏偏與公主長得像谎亩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子宇姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • 之前在網(wǎng)上找有關(guān)反射機(jī)制的資料發(fā)現(xiàn)網(wǎng)上關(guān)于這塊的資料不多,而且不太容易懂,所以試著寫一篇我自己所理解的反射機(jī)制希望...
    Lipt0n閱讀 19,171評論 19 62
  • 01匈庭、反射 主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力浑劳。 02阱持、反射作用 反編譯:將 class ...
    IT一書生閱讀 2,201評論 0 12
  • 文 / 西門君 圖 / 網(wǎng)絡(luò) 1. 昨天和閨蜜吃飯蒜绽,她愁眉苦臉地說镶骗,最近心情糟透了。 「咋了躲雅,又失戀了鼎姊?」我關(guān)切地...
    西門君不吐槽閱讀 715評論 0 1
  • 平行Amal 腹有詩書氣自華 對于那些愛看書的明星來說此蜈,他們的生活應(yīng)該更加寧靜自持,少了許多讓人心浮氣躁的情緒噪生。當(dāng)...
    平行Amal閱讀 354評論 0 0
  • 曾以為只要努力了裆赵,就可以做好想要做的事情,只要投資了跺嗽,就期待有臆想中的回報(bào)战授。然而其實(shí)沒有這么簡單页藻,一周又過去了,很...
    張瑞秋5114閱讀 390評論 3 1