android 自定義注釋

為了在android開發(fā)中省去一些重復的代碼輸入,我們現(xiàn)在都在使用butterknife**這樣的框架韧骗,進行代碼的簡化能犯。使用這種框架能提供我們很多的方便,但是我們也要了解它的實現(xiàn)原理和方法织阳。

(1)用的知識

  1.使用了java中的自定義注釋(Annotation)
  2.使用了反射原理(反射原理大家可以在網上搜索學習)

(2)Annotation介紹

1.Annotation是用那修飾類,屬性砰粹,方法唧躲。
2.元注釋:是專用來注釋其他注釋。

//元注釋的格式如下

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface onClick {   
    int[] value() default {};
}

大致了解了元注釋的實現(xiàn)伸眶,我們來看下元格式的基本語法惊窖。
元注釋分4種:
1.@Target :表示Annotation可以用在什么地方
它的取值為:


Paste_Image.png

2.@Retention:表示什么級別保持注釋信息
它的取值為:


Paste_Image.png

3.@Documented:表示在Javadocs中包含這個注解刽宪。
4.@Inherited :表示允許子類繼承父類中的注解厘贼。

3.實現(xiàn)流程

實現(xiàn)流程:定義一個注釋類,在使用的地方調用圣拄,關鍵是通過反射的方法調用系統(tǒng)中的對應函數(shù)嘴秸。
下面通過自定義android中的設置布局的例子,了解其流程:


Paste_Image.png

1.定義注釋類(ContentView.java)

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {   
     int value();
}

2.activity中調用注釋

@ContentView(R.layout.inject_view)
public class InjectActivity extends Activity {
       @Override    
      protected void onCreate(Bundle savedInstanceState) {        
            super.onCreate(savedInstanceState);        
            ViewInjectUtils.injectContentView(this);        
      }    
 }

3.關鍵步驟實現(xiàn)反射回調

public class ViewInjectUtils {

    //設置布局
    public static void injectContentView(Activity activity) {
        Class a = activity.getClass();
        if (a.isAnnotationPresent(ContentView.class)) {
            // 得到activity這個類的ContentView注解
            ContentView contentView = (ContentView) a.getAnnotation(ContentView.class);
            // 得到注解的值
            int layoutId = contentView.value();
            // 使用反射調用setContentView
            try {
                Method method = a.getMethod("setContentView", int.class);
                method.setAccessible(true);
                method.invoke(activity, layoutId);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}

4.反射回調的實現(xiàn)

@Target取值不同實現(xiàn)回調時候調用的方法就不同庇谆,下面介紹下
ElementType.TYPE岳掐,ElementType.METHOD,ElementType.FIELD回調的方法
(1)ElementType.TYPE定義類饭耳,接口和enum聲明串述。在android中,可以認為是定義activity中的布局文件寞肖。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2890654-a51e7fc4032c063c.png? imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
(2)ElementType.FIELD定義域聲明纲酗。在android中,可以認為是定義activity中每個控件新蟆。

Paste_Image.png

(3)ElementType.METHOD定義方法觅赊。在android中,可以認為是定義activity中點擊事件琼稻。
1.定義注釋類
Paste_Image.png

2.定義一個注釋類型聲明
Paste_Image.png

3.調用事件
Paste_Image.png

使用了動態(tài)代理
Paste_Image.png

全部代碼:http://download.csdn.net/download/txb2jf/9681928

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吮螺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帕翻,更是在濱河造成了極大的恐慌鸠补,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘀掸,死亡現(xiàn)場離奇詭異紫岩,居然都是意外死亡,警方通過查閱死者的電腦和手機横殴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門被因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿拴,“玉大人,你說我怎么就攤上這事梨与《榛ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵粥鞋,是天一觀的道長缘挽。 經常有香客問我,道長呻粹,這世上最難降的妖魔是什么壕曼? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮等浊,結果婚禮上腮郊,老公的妹妹穿的比我還像新娘。我一直安慰自己筹燕,他們只是感情好轧飞,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒踪,像睡著了一般过咬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上制妄,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天掸绞,我揣著相機與錄音,去河邊找鬼耕捞。 笑死衔掸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的砸脊。 我是一名探鬼主播具篇,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凌埂!你這毒婦竟也來了驱显?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瞳抓,失蹤者是張志新(化名)和其女友劉穎埃疫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孩哑,經...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡栓霜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了横蜒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胳蛮。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡销凑,死狀恐怖,靈堂內的尸體忽然破棺而出仅炊,到底是詐尸還是另有隱情斗幼,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布抚垄,位于F島的核電站蜕窿,受9級特大地震影響,放射性物質發(fā)生泄漏呆馁。R本人自食惡果不足惜桐经,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浙滤。 院中可真熱鬧阴挣,春花似錦瓷叫、人聲如沸屯吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽次氨。三九已至,卻和暖如春摘投,著一層夾襖步出監(jiān)牢的瞬間煮寡,已是汗流浹背犀呼。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外臂,地道東北人坐儿。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像宋光,于是被迫代替她去往敵國和親貌矿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,338評論 25 707
  • 第147章回顧 “外面風雨大作逛漫,且看在我們兄弟多年不見的份上赘艳,不如皇兄先進來小敘克握,朕這就命人為皇兄安排住處÷贶瘢” 尚...
    陳瀛Neptune閱讀 509評論 20 15
  • 從0到1孽江,我們歷經無數(shù)對錯。 從愛到不愛岗屏,我們品嘗萬千苦澀。 從“生而為人”这刷,到“我很抱歉”,我們仿佛經歷了一場場...
    時光不及回憶長閱讀 3,486評論 0 2
  • Note:以下所有命令及涉及到的腳本均在RHEL 6.6 / VMWare上測試通過似袁。主機配置:eth0為對外服務...
    CaiQingChong閱讀 397評論 0 0
  • 強連接繼續(xù)增強 今日先支持林會長對近期的工作事項進行梳理咐刨,然后支持他與創(chuàng)客小鎮(zhèn)公司總經理HQ進行三方會談昙衅,應用邏輯...
    特舒閱讀 208評論 0 0