Android注解的深入淺出

一验辞、注解

1稿黄、元注解

簡(jiǎn)單描述:是由Java提供的基礎(chǔ)注解,負(fù)責(zé)注解其它注解

2跌造、元注解有

@Target? -----------> 注解對(duì)象的范圍

@Retention --------> 注解保留的生命周期

@Inherited ---------> 標(biāo)明所修飾的注解在所作用的類上杆怕,是否可以被繼承

@Documented ---->? javadoc的工具文檔化,一般不關(guān)心

3鼻听、常用注解解釋


Target注解的范圍
@Retention 注解解釋

二财著、自定義注解

1、自定義注解規(guī)則:

Java 案例

其中:@Target 和 @Retention 這兩個(gè)就是上面講的元注解撑碴,(上面定義也說(shuō)了撑教,負(fù)責(zé)注解其他注解。)醉拓,value 就是在你使用自定義注解的時(shí)候需要填寫的內(nèi)容 如:@BindView( 這里就是需要填寫的int 類型的值 )

使用:

自定義注解的使用案例

kotlin 自定義注解如下

kotlin 注解

kotlin 自定義注解的使用伟姐,同上java的注解一樣。

三亿卤、自定義注解的應(yīng)用 (APT 技術(shù))

上面自定義注解大家應(yīng)該都知道如何去創(chuàng)建和使用了愤兵,但是使用之后如何去處理和解析自定義注解才是關(guān)鍵。下面講通過(guò)一個(gè)案例講解如何去使用并解析排吴,注解能做到哪些事情秆乳。

項(xiàng)目主要的內(nèi)容和背景:模仿ButterKnife,通過(guò)注解去實(shí)現(xiàn)findviewById 的操作。

項(xiàng)目前期準(zhǔn)備工作钻哩,三步走:
1屹堰、創(chuàng)建model ,這里主要?jiǎng)?chuàng)建兩個(gè)model,一個(gè)是專門放注解的 annotations ,一個(gè)是用來(lái)解析注解的annotation_compiler


項(xiàng)目model的創(chuàng)建

2、在annotation_compiler 中添加AutoService的注解街氢,為了幫助我們對(duì)注解進(jìn)行處理:

在annotation_compiler中添加

3扯键、添加相互的依賴

首先:annotation_compiler 項(xiàng)目是對(duì)annotation中注解的內(nèi)容進(jìn)行解析,所以珊肃,annotation_compiler中需要添加對(duì)annotation的依賴荣刑,所以需要在annotation_compiler項(xiàng)目gradle中添加:

annotation_compiler項(xiàng)目gradle中添加

同時(shí)項(xiàng)目中需要使用到注解,因?yàn)槲覀儗懙倪@個(gè)注解也是為了提供給項(xiàng)目(app)伦乔,進(jìn)行使用的厉亏,所以項(xiàng)目中我們要添加對(duì)annotation_compiler和annotation 的依賴。所以這里在app中的gradle中添加如下代碼:

項(xiàng)目中添加依賴评矩,同事注意紅色部分

正式的項(xiàng)目開(kāi)始

首先我們需要了解到叶堆,注解的解析發(fā)生在 java---->javac 編譯過(guò)程中去實(shí)現(xiàn)的,而后面我們要講到的插樁技術(shù)是發(fā)上在 javac---->dex 之間的斥杜。所以注解實(shí)際上是對(duì)注解所標(biāo)記的內(nèi)容進(jìn)行處理虱颗,并生成對(duì)應(yīng)的 .java 文件沥匈。

下面開(kāi)始進(jìn)入正題:

在annotation 中編寫注解

注解

在annotation_compiler 編寫對(duì)應(yīng)的解析類,并生成處理被標(biāo)記的屬性的方法忘渔。

思路:因?yàn)槲覀兿胍龅氖莊indviewById, 所以我們首先要確定我們的注解注解了哪些view,同時(shí)需要生成一個(gè)文件高帖,而這個(gè)文件做的事情就是 對(duì)所有被標(biāo)記的view,進(jìn)行findViewById.

在annotation_compiler 中創(chuàng)建一個(gè)類,這里就叫:AnnotationCompiler 繼承自?AbstractProcessor

類的創(chuàng)建畦粮,已經(jīng)對(duì)應(yīng)的標(biāo)記

初始化等會(huì)生成文件需要用到的類散址,同時(shí)實(shí)現(xiàn)兩個(gè)父類的方法,如下

注意:當(dāng)java在編譯的時(shí)候宣赔,會(huì)自動(dòng)執(zhí)行 process 中的方法预麸,并將被注解的元素和方法,回傳到這里儒将,所以后面我們就是在這個(gè)父類的方法下面對(duì)應(yīng)的去解析被標(biāo)注的view.

這里要注意一定要記得關(guān)流吏祸,一定要記得關(guān)流,一定要記得關(guān)流

這里來(lái)看下我們生成的文件是什么樣子的:

在app中钩蚊,我們對(duì)應(yīng)的編寫一個(gè)類贡翘,一個(gè)是接口,接口是為了綁定講對(duì)應(yīng)的view 傳遞到生成的類中去的砰逻,上面也看到了鸣驱,我們生成的類實(shí)現(xiàn)了一個(gè)接口叫:IBinder,? 為什么要這樣蝠咆,因?yàn)槟銜?huì)看到其實(shí)findviewById踊东,前面是有一個(gè)view的,真正的findViewById 應(yīng)該是 view.findViewById.

編寫一個(gè)用來(lái)綁定的幫助類如下

在activity 中如何去使用:

總結(jié):在不知道我們要生成什么文件的時(shí)候刚操,我們可以先用java實(shí)現(xiàn)我們的功能递胧,再講這些重復(fù)的功能通過(guò)注解去生成文件在進(jìn)行統(tǒng)一處理,這樣就可以知道我們?cè)谏晌募臅r(shí)候赡茸,如何去對(duì)應(yīng)的去寫每一行代碼了。

注意:
1祝闻、把工程的gradle-wrapper和gradle-plugin分別降低到4.10.1占卧,3.2.0原因:gradle - 3.3 - 3.4 中 javaCompileTask 沒(méi)有處理 Annotation Processer
2、有些無(wú)法生成對(duì)應(yīng)的文件联喘,這里需要我們創(chuàng)建如下文件夾以及文件华蜒,切記要一模一樣。

文件夾:resources\META-INF\services
文件:javax.annotation.processing.Processor
內(nèi)容:為你編寫的AnnotationCompiler全路徑豁遭,這里我的文件全路徑為:com.example.annotation_compiler.AnnotationCompiler

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叭喜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蓖谢,更是在濱河造成了極大的恐慌捂蕴,老刑警劉巖譬涡,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異啥辨,居然都是意外死亡涡匀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門溉知,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陨瘩,“玉大人,你說(shuō)我怎么就攤上這事级乍∩嗬停” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵玫荣,是天一觀的道長(zhǎng)甚淡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)崇决,這世上最難降的妖魔是什么材诽? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恒傻,結(jié)果婚禮上脸侥,老公的妹妹穿的比我還像新娘。我一直安慰自己盈厘,他們只是感情好睁枕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沸手,像睡著了一般外遇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上契吉,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天跳仿,我揣著相機(jī)與錄音,去河邊找鬼捐晶。 笑死菲语,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惑灵。 我是一名探鬼主播山上,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼英支!你這毒婦竟也來(lái)了佩憾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妄帘,沒(méi)想到半個(gè)月后楞黄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寄摆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谅辣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婶恼。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桑阶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勾邦,到底是詐尸還是另有隱情蚣录,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布眷篇,位于F島的核電站萎河,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蕉饼。R本人自食惡果不足惜虐杯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昧港。 院中可真熱鬧擎椰,春花似錦、人聲如沸创肥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叹侄。三九已至巩搏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趾代,已是汗流浹背贯底。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撒强,地道東北人丈甸。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尿褪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子得湘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 一杖玲、什么是注解? 注解對(duì)于開(kāi)發(fā)人員來(lái)講既熟悉又陌生淘正,熟悉是因?yàn)橹灰闶亲鲩_(kāi)發(fā)摆马,都會(huì)用到注解(常見(jiàn)的@Overrid...
    _Justin閱讀 1,344評(píng)論 0 10
  • 什么是注解 注解對(duì)于開(kāi)發(fā)人員來(lái)講既熟悉又陌生臼闻,熟悉是因?yàn)橹灰闶亲鲩_(kāi)發(fā),都會(huì)用到注解(常見(jiàn)的@Override)囤采;...
    張明云閱讀 25,122評(píng)論 6 154
  • 寫在前面 由于文章和代碼寫的比較久了再次翻看閱讀述呐,打開(kāi)工程運(yùn)行的時(shí)候,發(fā)現(xiàn)注解處理器不生效浪費(fèi)了很多時(shí)間才搞清楚問(wèn)...
    青果果閱讀 616評(píng)論 1 2
  • 一蕉毯、什么是注解 注解可以向編譯器乓搬、虛擬機(jī)等解釋說(shuō)明一些事情。舉一個(gè)最常見(jiàn)的例子代虾,當(dāng)我們?cè)谧宇惍?dāng)中覆寫父類的aMet...
    澤毛閱讀 6,465評(píng)論 6 22
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月进肯,有人笑有人哭,有人歡樂(lè)有人憂愁棉磨,有人驚喜有人失落江掩,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,523評(píng)論 28 53