分分鐘理解注解(Annotation)與反射(Reflect)的搭配

首先。寫(xiě)這篇文章是因?yàn)榫W(wǎng)上大部分對(duì)這兩個(gè)技術(shù)通常都分開(kāi)描述藏否,似乎沒(méi)有一篇文章對(duì)兩者之間專(zhuān)門(mén)描述期吓,所以才有了這篇文章苛白。該文章適合對(duì)注解與反射不了解或者不知道這兩個(gè)如何搭配的人看呐赡。如果你有一定了解可以選擇性查看退客。

文章會(huì)分三部分:反射與注解的基本使用與搭配,并盡可能的簡(jiǎn)短(我不太適合長(zhǎng)篇大論链嘀,并且如果兩個(gè)技術(shù)點(diǎn)一起講估計(jì)會(huì)很長(zhǎng)萌狂,這篇可是當(dāng)作是“指導(dǎo)篇”吧)會(huì)有幾個(gè)鏈接方便讀者查看更詳細(xì)內(nèi)容。

注解在Android中應(yīng)用的范圍還是比較廣的怀泊,流行庫(kù)Retrofit Butterknife等都使用到了注解的技術(shù)茫藏,?我們經(jīng)常使用但它的具體操作是怎么一個(gè)流程呢?當(dāng)你第一次使用快捷鍵想看這個(gè)注解里面都做的了什么的時(shí)候你會(huì)看到比如類(lèi)似這樣

image.png

第一感覺(jué)就是懵逼(我cao這怎么什么都沒(méi)有注解這到底是干嘛的)這時(shí)候估計(jì)你就點(diǎn)回來(lái)繼續(xù)擼別的代碼了包个。嗯刷允。我之前也是這樣冤留。好碧囊。要想知道它是用來(lái)干什么先來(lái)看看反射。

反射

簡(jiǎn)單來(lái)說(shuō)纤怒,反射就是在運(yùn)行時(shí)可以獲取任意 Class 或 Object 內(nèi)部所有成員屬性糯而,如成員變量、成員方法泊窘、構(gòu)造函數(shù)和 Annotation(注解)
推薦大家先看這位大神的文章了解一下,對(duì)反射的基本使用講解的還是很清楚的
http://wingjay.com/2017/04/26/Java-%E6%8A%80%E6%9C%AF%E4%B9%8B%E5%8F%8D%E5%B0%84/

我們可以通過(guò)getDeclaredFields getDeclaredMethods getDeclaredConstructors等方法獲取常用的成員變量熄驼、獲取成員方法像寒、獲取構(gòu)造函數(shù)等等
而其中我們可以通過(guò)isAnnotationPresent getAnnotation來(lái)判斷某個(gè)方法或變量甚至類(lèi)是否被某個(gè)注解類(lèi)注解,并且獲取注解類(lèi)中的變量與被注解的變量或方法的參數(shù)等等瓜贾。
舉個(gè)栗子:

image.png

這里可以看到通過(guò)反射拿到了注解類(lèi)中輸入的參數(shù)然后對(duì)其變量進(jìn)行操作诺祸。到這里大概就應(yīng)該有點(diǎn)明白了吧。下來(lái)我們就說(shuō)說(shuō)注解祭芦。

注解

注解就相當(dāng)于一個(gè)模板筷笨,通過(guò)注解的方式直接套用在不同的地方。省去了很多utils等多余的代碼龟劲。同樣可以使用注解來(lái)自動(dòng)生成代碼了胃夏,注解作用很強(qiáng)大。

注解的基本知識(shí)依然推薦大家先看這位大神的文章了解一下昌跌,對(duì)注解有個(gè)概念
http://wingjay.com/2017/05/03/Java-%E6%8A%80%E6%9C%AF%E4%B9%8B%E6%B3%A8%E8%A7%A3-Annotation/

自定義注解時(shí)我們可以通過(guò)RetentionPolicy.SOURCE RetentionPolicy.CLASS RetentionPolicy.RUNTIME規(guī)定注解在編輯期編譯期仰禀、運(yùn)行期它是否進(jìn)行參與
使用@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})來(lái)指定可以被注解的對(duì)象,更多用法可以看上面的鏈接這里就不細(xì)講了蚕愤。
他的寫(xiě)法是通常如第一張圖(BindView)答恶,使用時(shí)像這樣

image.png

是不是感覺(jué)很熟悉。是不是和Butterknife如出一轍萍诱。好亥宿。下面就該說(shuō)說(shuō)反射和注解的搭配了。

搭配

如果你仔細(xì)看了前面的內(nèi)容包括這兩個(gè)鏈接那么下面的東西你應(yīng)該很好吸收了砂沛,如果沒(méi)有仔細(xì)看還是先回頭看看烫扼,否則可能會(huì)不理解

以上面BindView為例,通過(guò)圖解來(lái)講講它們結(jié)合在一起的使用:

  • 首先我們需要一個(gè)BindView注解類(lèi)作為模板來(lái)收集數(shù)據(jù)碍庵,指定它被用于成員變量并且在運(yùn)行時(shí)出依然有效映企,同時(shí)需要一個(gè)value來(lái)作為后面findviewById的值
image.png
  • 這時(shí)你就可以使用注解了,并調(diào)用方法將activity傳入便于后續(xù)操作静浴,這里我沒(méi)有直接使用setContentView方法堰氓,我同樣使用了注解方式,設(shè)置布局方法類(lèi)似你看完肯定也就會(huì)寫(xiě)了苹享,這個(gè)就留給讀者了双絮。
image.png
image.png
  • 模板寫(xiě)好了也用在了具體的地方,這時(shí)我們就該編寫(xiě)反射類(lèi)來(lái)獲取注解里輸入的值與變量得问。?并進(jìn)行對(duì)應(yīng)操作
image.png

上面的代碼通過(guò)對(duì)反射拿出所有被BindView注解的成員變量并取出BindView的value值進(jìn)行findviewById給成員變量賦值囤攀。就這么幾行代碼就完成了一個(gè)簡(jiǎn)單的Butterknife對(duì)View進(jìn)行賦值的一個(gè)操作。

注解和反射是一扇新大門(mén)宫纬。對(duì)注解和注解和反射有很好的操作話(huà)會(huì)節(jié)省很多我們重復(fù)的工作焚挠。甚至少寫(xiě)很多代碼就能完成同樣的事情。

總結(jié):注解就是模板漓骚,收集需要的數(shù)據(jù)和可以看做是一種特殊的函數(shù)蝌衔,使用反射拿到注解和被注解的值進(jìn)行操作榛泛。

希望本篇文章對(duì)初始注解和反射的人會(huì)有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末噩斟,一起剝皮案震驚了整個(gè)濱河市曹锨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剃允,老刑警劉巖艘希,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硅急,居然都是意外死亡覆享,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)营袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撒顿,“玉大人,你說(shuō)我怎么就攤上這事荚板》锉冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵跪另,是天一觀的道長(zhǎng)拧抖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)免绿,這世上最難降的妖魔是什么唧席? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮嘲驾,結(jié)果婚禮上淌哟,老公的妹妹穿的比我還像新娘。我一直安慰自己辽故,他們只是感情好徒仓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著誊垢,像睡著了一般掉弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喂走,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天殃饿,我揣著相機(jī)與錄音,去河邊找鬼缴啡。 笑死壁晒,一個(gè)胖子當(dāng)著我的面吹牛瓷们,可吹牛的內(nèi)容都是我干的业栅。 我是一名探鬼主播秒咐,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碘裕!你這毒婦竟也來(lái)了携取?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帮孔,失蹤者是張志新(化名)和其女友劉穎雷滋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體文兢,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晤斩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姆坚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳泵。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兼呵,靈堂內(nèi)的尸體忽然破棺而出兔辅,到底是詐尸還是另有隱情,我是刑警寧澤击喂,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布维苔,位于F島的核電站,受9級(jí)特大地震影響懂昂,放射性物質(zhì)發(fā)生泄漏介时。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一凌彬、第九天 我趴在偏房一處隱蔽的房頂上張望潮尝。 院中可真熱鬧,春花似錦饿序、人聲如沸勉失。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乱凿。三九已至,卻和暖如春咽弦,著一層夾襖步出監(jiān)牢的瞬間徒蟆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工型型, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留段审,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓闹蒜,卻偏偏與公主長(zhǎng)得像寺枉,于是被迫代替她去往敵國(guó)和親抑淫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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