資源描述:
《java反射最佳實(shí)踐-java開發(fā)java經(jīng)驗(yàn)技巧》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Java反射最佳實(shí)踐-編程開發(fā)技術(shù)Java反射最佳實(shí)踐原文出處:@天之界線2010概要:最簡單優(yōu)雅的使用反射。本文的例子都可以在示例代碼小看到并下載,如果喜歡請star,如果覺得有紗匕漏請?zhí)峤籭ssue,如果你有更好的點(diǎn)子可以提交pullrequesto本文的示例代碼主要是基于jOOR行編寫的,如果想了解更多請查看這里的測試代碼。固定連接:https://github.com/tianzhijiexian/Android-Best-Practices/blob/master/2015.9/rcflcct/rcflcct.md一、需求今天一個“懶”程序員突然跑過來說:“
2、反射好麻煩,我耍提點(diǎn)需求。”聽到這句話后我就知道,今天一定不好過了,奇葩需求又來了。我們2前寫反射都是要這么寫:publicstaticTcreate(HttpRequesthttpRequest){ObjecthttpRequestEntity二null;try{ClasshttpRequestEntityCls=(Class)Class.forName(HttpProccssor.PACKAGENAME+"+HttpProcessor.CLASS_NAME);Constructorcon二httpRequeslEntiLyCls.getConst
3、ructor(HttpRequest.class);httpRequestEntity二con.newlnstanee(httpRequest);}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printstackTraccO;}catch(NoSuchMethodExceptione){e.printStackTrace();}catch(T
4、nvocationTargetExceptione){e.printStackTrace();return(T)httpRequestEntity;因?yàn)榉瓷湓陂_發(fā)中很少用(做普通的業(yè)務(wù)開發(fā)的話),僅僅在自己寫一些框架和注解框架時會用到,所以對api總是不熟悉。每次用到api都耍去網(wǎng)上查,查了后乂得自己實(shí)驗(yàn)下,很不爽。更差勁的是這樣寫法可讀性十分低下。我不希槊這樣寫反射,我希望反射能像Stringstr二newString();這樣簡單,一行代碼搞定!。此外,有很多人都說反射影響性能,在開發(fā)的時候耍避免用反射。那么什么時候該用反射,什么時候不用反射呢?用什么方式來避免反
5、射呢?如果不明白什么時候用反射,就很難將反射活學(xué)活用了。二、分析當(dāng)我們接到上面需求后,我長舒一口氣,因?yàn)檫@回的需求還比較簡單。我相信有人會說:“反射就那幾個api,—直沒變過,你就不會自己去查啊,覺得麻煩就別寫代碼啊,不知道反射的內(nèi)部細(xì)節(jié)你怎么去提高呢?”其實(shí)不然,重復(fù)寫麻煩的代碼和提高口己的代碼能力是完全無關(guān)的,我實(shí)在不知道我們寫了成千上萬行的findViewByTd后除了知道類要和xml文件綁定外,還學(xué)到了什么。那么這回我們繼續(xù)來挑戰(zhàn)傳統(tǒng)思維和模板式代碼,來看看新一代的反射代碼應(yīng)該怎么寫,如何用一行代碼來反射岀類。在做之前,來看看我們一般用反射來干嘛?1.反射構(gòu)建
6、出無法直接訪問的類?2.set或get到無法訪問的類變量?3.調(diào)用不可訪問的方法三、解決方案3.1一行代碼寫反射作為一個Android程序員,索性就拿TextView這個類開刀吧。首先定義一個類變量:TextViewmTv;通過反射得到實(shí)例://有參數(shù),建立類mTv二Reflect,on(TextView.class),create(this).get();//通過類全名得到類Stringword=Reflect,on(,zjava.lang.String77),create(,zReflectTextView").get();//無參數(shù),建立類Fragmentfra
7、gment=Reflect.on(Fragment.class)?create()?get();通過反射調(diào)用方法:〃調(diào)用無參數(shù)方法L?d("callgetText():"+Reflect,on(mTv).call(,zgetText,z).toStringO);//調(diào)用有參數(shù)方法Reflect,on(mTv).call("setTextColor",OxffffOOOO);通過反射get、set類變量TextView中冇個mText變量,來看看我們怎么接近它。//設(shè)置參數(shù)Reflect.on(mTv).set("mText","newReflectT