Android進(jìn)階: 注解從入門到精通

注解實(shí)現(xiàn)三部曲

使用場(chǎng)景

  • EventBus使用
    @Subscriber(mode = ThreadMode.MAIN, tag = EventTag.STORE_OUT_SUMMARIZING)
    internal fun refresh(list: Any) {
        getOutList()
    }
  • bufferknife點(diǎn)擊事件使用
       @OnClick(R.id.btn_login)
       public void onViewClicked() {

       }

原理:和監(jiān)聽有點(diǎn)類似谊惭,通過定義一個(gè)接口實(shí)現(xiàn)注解標(biāo)簽的使用乳愉,然后定義一個(gè)類掉房,通過反射對(duì)所有使用注解的文件進(jìn)行二級(jí)操作茫陆。

那么問題來了仗岖,如果我們想使用注解逃延,該如何做昵?

使用三部曲

  • 1.定義一個(gè)接口
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {
    public String source() default "nothing";
}

解釋:

@Target


@Target說明了Annotation所修飾的對(duì)象范圍:Annotation可被用于
packages轧拄、types(類揽祥、接口、枚舉檩电、Annotation類型)拄丰、類型成員(方法、構(gòu)造方法俐末、成員變量料按、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量卓箫、catch參數(shù))载矿。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類烹卒、接口(包括注解類型) 或enum聲明

@Retention


@Retention定義了該Annotation被保留的時(shí)間長(zhǎng)短:某些Annotation僅出現(xiàn)在源代碼中恢准,而被編譯器丟棄魂挂;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會(huì)被虛擬機(jī)忽略馁筐,而另一些在class被裝載時(shí)將被讀取(請(qǐng)注意并不影響class的執(zhí)行坠非,因?yàn)锳nnotation與class在使用上是被分離的)敏沉。使用這個(gè)meta-Annotation可以對(duì)
Annotation的“生命周期”限制。

取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
  • 2.注解事件處理器
package com.chen.annotation

import android.view.View
import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy

import king.bird.annotation.Action

/**
 * <pre>
 * author : Wp
 * e-mail : 18141924293@163.com
 * time   : 2018/09/10
 * desc   : 注解實(shí)例
 * version: 1.0
 *</pre>
 */
class ActionInstaller {

    companion object {

        fun processAnnotations(client: Any) {
            val clientClass = client.javaClass

            for (m in clientClass.declaredMethods) {

                //獲取指定Annotation對(duì)象
                val listener = m.getAnnotation(Action::class.java!!)

                if (listener != null) {
                    try {
                        val f = clientClass.getDeclaredField(listener.source)
                        f.isAccessible = true
                        //控件對(duì)象
                        val focusView = f.get(client)
                        addListener(focusView, client, m)
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }

                }

            }

        }

        @Throws(Exception::class)
        private fun addListener(focusView: Any, client: Any, m: Method) {

            val handler = InvocationHandler { proxy, method, args ->
                //場(chǎng)景類調(diào)用 onBtnClick() 方法
                m.invoke(client)
            }

            val onClickListener = Proxy.newProxyInstance(null, arrayOf<Class<*>>(View.OnClickListener::class.java), handler)
            val setOnClickListenerMethod = focusView.javaClass.getMethod("setOnClickListener", View.OnClickListener::class.java)
            setOnClickListenerMethod.invoke(focusView, onClickListener)

        }

    }

}
  • 3.實(shí)際應(yīng)用
    @Action(source = "mBtnTest")
    fun onBtnClick() {
        Log.e("Test", "mBtnTest點(diǎn)擊")
    }

項(xiàng)目demo詳見Github

參與貢獻(xiàn)

  1. Fork 本項(xiàng)目
  2. 新建 Feat_xxx 分支
  3. 提交代碼
  4. 新建 Pull Request

github地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炎码,一起剝皮案震驚了整個(gè)濱河市盟迟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潦闲,老刑警劉巖攒菠,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異歉闰,居然都是意外死亡辖众,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門和敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凹炸,“玉大人,你說我怎么就攤上這事昼弟∑∷” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵舱痘,是天一觀的道長(zhǎng)变骡。 經(jīng)常有香客問我,道長(zhǎng)芭逝,這世上最難降的妖魔是什么塌碌? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮铝耻,結(jié)果婚禮上誊爹,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢捉,他們只是感情好频丘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泡态,像睡著了一般搂漠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上某弦,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天桐汤,我揣著相機(jī)與錄音而克,去河邊找鬼。 笑死怔毛,一個(gè)胖子當(dāng)著我的面吹牛员萍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拣度,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼碎绎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了抗果?” 一聲冷哼從身側(cè)響起筋帖,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冤馏,沒想到半個(gè)月后日麸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮光,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年代箭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睦霎。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梢卸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出副女,到底是詐尸還是另有隱情蛤高,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布碑幅,位于F島的核電站戴陡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沟涨。R本人自食惡果不足惜恤批,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裹赴。 院中可真熱鬧喜庞,春花似錦、人聲如沸棋返。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睛竣。三九已至晰房,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殊者。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工与境, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猖吴。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓摔刁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親海蔽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子簸搞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料准潭? 從這篇文章中你...
    hw1212閱讀 12,745評(píng)論 2 59
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評(píng)論 25 707
  • 08年春節(jié)我那封建固執(zhí)的老爸終于知道了全以前離過婚有個(gè)兒子的事情他的反應(yīng)是出乎我意料之外的平靜,他居然沒有找我談話...
    花仙子的天空閱讀 981評(píng)論 0 0
  • 17年可能是個(gè)悲傷的年份域仇,在我走后的三天刑然,呼和下了一場(chǎng)大雪.我在呼和生活了四年,孑然一身來暇务,又孑然一身走.四...
    酒言之閱讀 768評(píng)論 0 1
  • 從放寒假以來泼掠,孩子一直在堅(jiān)持每天讀書,從開始的不太愿意到現(xiàn)在已經(jīng)開始有點(diǎn)順了垦细,天天到點(diǎn)就自覺讀書择镇,而且我也在她讀書...
    星耀三年三班劉暢閱讀 189評(píng)論 0 0