Android中常用的反射舉例

隨著工作年限的增加皱蹦,日常工作中的需求已不再是findViewById那么簡(jiǎn)單了澎胡,更多的傾向于框架化述暂,源碼化的方向發(fā)展,什么叫源碼化呢责球?就是我們?cè)谧鲆粋€(gè)工具(比如一個(gè)像自定義IOC工具)的時(shí)候更多的像源碼發(fā)起進(jìn)攻焦履,分析他然后掌握它,并且在做這些工具時(shí)往往有些系統(tǒng)類或類中的方法被隱藏雏逾,這是就需要使用反射來(lái)解決。現(xiàn)在來(lái)例舉下常用的反射操作郑临。

一栖博、是什么

反射是什么,許多博客上面都把書(shū)上的解釋拿過(guò)來(lái)照著打厢洞,但是往往書(shū)上的理論性文字很難理解仇让,所以這里概括一句話:“反射就是獲取你想獲取的一個(gè)類中的類實(shí)例、方法躺翻、成員變量丧叽。即使這個(gè)類不對(duì)外暴露」悖”

二踊淳、舉例

先創(chuàng)建一個(gè)用于演示的JavaBean

public class Test {

    private String code;
    private String msg;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

2.1、獲取類實(shí)例

//假如Test是一個(gè)被hind的系統(tǒng)類陕靠,一般方法實(shí)例化不了迂尝。so?用反射實(shí)例化
Test test = Test.class.newInstance();

2.2剪芥、獲取單個(gè)方法并調(diào)用

//單個(gè)方法
//先向反射獲取的類實(shí)例調(diào)用setCode對(duì)code成員變量賦值
Method method = Test.class.getDeclaredMethod("setCode", String.class);
method.setAccessible(true);
//不管是什么是有權(quán)限設(shè)置比如private什么的垄开,都可以獲取,建議不管怎么樣都設(shè)置下税肪,這樣就不會(huì)忘
method.invoke(test,"3333");//調(diào)用方法
//向反射獲取的類實(shí)例調(diào)用getCode對(duì)code成員變量取值
Method method1 = Test.class.getDeclaredMethod("getCode");
method1.setAccessible(true);
//不管是什么是有權(quán)限設(shè)置比如private什么的溉躲,都可以獲取,建議不管怎么樣都設(shè)置下益兄,這樣就不會(huì)忘
String s = (String) method1.invoke(test);//執(zhí)行單個(gè)方法
System.out.println("yanjin-----"+s);

網(wǎng)上很多人問(wèn)getDeclaredMethod與getMethod有什么區(qū)別锻梳,我覺(jué)得記住getDeclaredMethod能獲取私有化方法就行就算被private修飾。但是記得拿到方法后設(shè)置setAccessible(true);不然也只能獲取public的方法偏塞。getDeclaredMethod的調(diào)用參數(shù)唱蒸,第一個(gè)是方法名比如上面的"setCode",第二個(gè)是參數(shù)類型的clazz灸叼,參數(shù)是String類型的就傳入String.class神汹,無(wú)參就不用管啦庆捺。invoke方法第一個(gè)參數(shù)是實(shí)例化的對(duì)象,如果有參數(shù)就要傳入具體值屁魏。

2.3獲取單個(gè)屬性并調(diào)用

//單個(gè)屬性
//獲取某個(gè)屬性的反射對(duì)象
Field field = Test.class.getDeclaredField("msg");
field.setAccessible(true);
//獲取屬性名字
String name = field.getName();
 //獲取屬性類型
String type = field.getType().getName();
 //設(shè)置屬性
 field.set(test,"hahhaha");
 //獲取屬性,
 Object values = field.get(test);

這里沒(méi)什么要注意的滔以,談的上的也有field.setAccessible(true);不要忘了。另外field.get(test);返回的是一個(gè)obj類型的氓拼,但是field里面也有g(shù)etInt等方法你画,所以需要將這個(gè)obj轉(zhuǎn)為Javabean中對(duì)應(yīng)的類型,這里需要封裝桃漾,基于上面已經(jīng)獲取的類型type坏匪,做一個(gè)if判斷即可,這里提供個(gè)思路撬统。

//默認(rèn)返回的是obj适滓,那么如果轉(zhuǎn)換成對(duì)應(yīng)屬性,可以自己封裝恋追,比如
String s1 =null;
int anInt=-1;
if (type.contains("String")) {
       s1 = field.get(test) + "";
} else if (type.contains("int")) {
       anInt = field.getInt(test);
}

2.4獲取所有成員變量或方法

//獲取所有方法
Method[] methods = Test.class.getDeclaredMethods();
for (Method method : methods) {
       method.setAccessible(true);
       ......
}
//獲取所有屬性
Field[] fields = Test.class.getDeclaredFields();
for (Field field : fields) {
       field.setAccessible(true);
......
}

獲取method或field 的單一實(shí)例后凭迹,之后的操作就和之前的操作一樣了违帆。

三隙券、總結(jié)

本文介紹的反射用法并不是很全,有些東西也沒(méi)涉及到断国,比如:asSubclass的用法

Class.forName("java.util.ArrayList").asSubclass(List.class).newInstance();//如果forName里面填寫的類是asSubclass里參數(shù)的子類撕彤,就實(shí)例化他

上述是寫IOC注解時(shí)用到的鱼鸠,并不是其他人那種直接copy。所以喉刘,希望不喜勿噴瞧柔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市睦裳,隨后出現(xiàn)的幾起案子造锅,更是在濱河造成了極大的恐慌,老刑警劉巖廉邑,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥蔚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛛蒙,警方通過(guò)查閱死者的電腦和手機(jī)糙箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牵祟,“玉大人深夯,你說(shuō)我怎么就攤上這事。” “怎么了咕晋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵雹拄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我掌呜,道長(zhǎng)滓玖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任质蕉,我火速辦了婚禮势篡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘模暗。我一直安慰自己禁悠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布汰蓉。 她就那樣靜靜地躺著绷蹲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾孽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天比规,我揣著相機(jī)與錄音若厚,去河邊找鬼。 笑死蜒什,一個(gè)胖子當(dāng)著我的面吹牛测秸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灾常,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼霎冯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钞瀑?” 一聲冷哼從身側(cè)響起沈撞,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雕什,沒(méi)想到半個(gè)月后缠俺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贷岸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年壹士,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偿警。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躏救,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出螟蒸,到底是詐尸還是另有隱情盒使,我是刑警寧澤崩掘,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站忠怖,受9級(jí)特大地震影響呢堰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凡泣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一枉疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞋拟,春花似錦骂维、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猴誊,卻和暖如春潦刃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懈叹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工乖杠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澄成。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓胧洒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親墨状。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卫漫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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