日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XUtils之注解机制详解

發(fā)布時間:2025/3/11 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XUtils之注解机制详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:http://blog.csdn.net/rain_butterfly/article/details/37931031

點(diǎn)擊閱讀原文

------------------------------------------------------

這篇文章說一下xUtils里面的注解原理。

? ? ? 先來看一下xUtils里面demo的代碼:

[java]?view plaincopy print?
  • @ViewInject(R.id.tabhost)??
  • ????private?FragmentTabHost?mTabHost;??
  • @ViewInject(R.id.big_img)??
  • ????private?ImageView?bigImage;??

  • ? ? ? ??可能好多人一看就說這是個what,其實(shí)這是Java core里面的內(nèi)容,做JavaEE的應(yīng)該很熟悉,像著名的spring框架就用了大量的注解。那到底什么是注解呢?下面詳細(xì)講解一下Java注解:

    ? ? ? ?注解(Annotation) 為我們在代碼中添加信息提供了一種形式化的方法,是我們可以在稍后某個時刻方便地使用這些數(shù)據(jù)(通過 解析注解 來使用這些數(shù)據(jù)),常見的作用有以下幾種:

    • 生成文檔。這是最常見的,也是java 最早提供的注解。常用的有@see @param @return 等
    • 跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能。比較常見的是spring 2.5 開始的基于注解配置。作用就是減少配置。現(xiàn)在的框架基本都使用了這種配置來減少配置文件的數(shù)量。也是
    • 在編譯時進(jìn)行格式檢查。如@override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。

    ? ? ? ?包?Java.lang.annotation?中包含所有定義自定義注解所需用到的原注解和接口。如接口java.lang.annotation.Annotation?是所有注解繼承的接口,并且是自動繼承,不需要定義時指定,類似于所有類都自動繼承Object。


    ? ? ??Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運(yùn)行時進(jìn)行解析和使用,起到說明、配置的功能。注解不會也不能影響代碼的實(shí)際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

    Annotation類型里面的參數(shù)該怎么設(shè)定:?
    ?? 第一,只能用public或默認(rèn)(default)這兩個訪問權(quán)修飾.例如,String value();這里把方法設(shè)為defaul默認(rèn)類型.?
    ?? 第二,參數(shù)成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和 ? ? ?String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組.例如,String value();這里的參數(shù)成員就為String.?
    ?? 第三,如果只有一個參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號.

    1、元注解

    ? ? ?元注解是指注解的注解。包括? @Retention @Target @Document @Inherited四種。

    1.1、@Retention: 定義注解的保留策略

    @Retention(RetentionPolicy.SOURCE)//注解僅存在于源碼中,在class字節(jié)碼文件中不包含 @Retention(RetentionPolicy.CLASS)// 默認(rèn)的保留策略,注解會在class字節(jié)碼文件中存在,但運(yùn)行時無法得 @Retention(RetentionPolicy.RUNTIME)// 注解會在class字節(jié)碼文件中存在,在運(yùn)行時可以通過反射獲取到
    1.2、@Target:定義注解的作用目標(biāo)
    其定義的源碼為:? @Documented
    ? ? @Retention(RetentionPolicy.RUNTIME)
    ? ? @Target(ElementType.ANNOTATION_TYPE)
    ? ? ?public @interface Target {
    ? ? ? ? ?ElementType[] value();
    ? ? ?}

    ? ? @Target(ElementType.TYPE)???//接口、類、枚舉、注解

    ? ? @Target(ElementType.FIELD)?//字段、枚舉的常量 ? ? @Target(ElementType.METHOD)?//方法 ? ? @Target(ElementType.PARAMETER)?//方法參數(shù) ? ? @Target(ElementType.CONSTRUCTOR)??//構(gòu)造函數(shù) ? ? @Target(ElementType.LOCAL_VARIABLE)//局部變量 ? ? @Target(ElementType.ANNOTATION_TYPE)//注解 ? ? @Target(ElementType.PACKAGE)?///包??? ? ? ??其中的@interface是一個關(guān)鍵字,在設(shè)計annotations的時候必須把一個類型定義為@interface,而不能用class或interface關(guān)鍵字,由以上的源碼可以知道,他的elementType?可以有多個,一個注解可以為類的,方法的,字段的等等。
    1.3、@Document:說明該注解將被包含在javadoc中 ? 1.4、@Inherited:說明子類可以繼承父類中的該注解
    2、java 注解的自定義
    下面是自定義注解的一個例子

    ? ? @Retention(RetentionPolicy.RUNTIME)定義的這個注解是注解會在class字節(jié)碼文件中存在,在運(yùn)行時可以通過反射獲取到。

    ? ? @Target({ElementType.TYPE,ElementType.METHOD})因此這個注解可以是類注解,也可以是方法的注解

    這樣一個注解就自定義好了,當(dāng)然注解里面的成員可以為基本的數(shù)據(jù)類型,也可以為數(shù)據(jù),Object等等

    大概了解了一下Java注解機(jī)制,下面就說一說xUtils里面用到的注解,以及思維流程:

    [java]?view plaincopy print?
  • package?com.lidroid.xutils.view.annotation;??
  • ??
  • import?java.lang.annotation.ElementType;??
  • import?java.lang.annotation.Retention;??
  • import?java.lang.annotation.RetentionPolicy;??
  • import?java.lang.annotation.Target;??
  • ??
  • @Target(ElementType.TYPE)??
  • @Retention(RetentionPolicy.RUNTIME)??
  • public?@interface?ContentView?{??
  • ????int?value();??
  • }??
  • 以上是ContentView的注解,一些聲明、參數(shù)。

    [java]?view plaincopy print?
  • private?static?void?injectObject(Object?handler,?ViewFinder?finder)?{??
  • ??
  • ???????Class<?>?handlerType?=?handler.getClass();??
  • ??
  • ???????//?inject?ContentView??
  • ???????ContentView?contentView?=?handlerType.getAnnotation(ContentView.class);??
  • ???????if?(contentView?!=?null)?{??
  • ???????????try?{??
  • ???????????????Method?setContentViewMethod?=?handlerType.getMethod("setContentView",?int.class);??
  • ???????????????setContentViewMethod.invoke(handler,?contentView.value());??
  • ???????????}?catch?(Throwable?e)?{??
  • ???????????????LogUtils.e(e.getMessage(),?e);??
  • ???????????}??
  • ???????}}??

  • ? ? ? 以上是ViewUtils里面的一個靜態(tài)注解對象函數(shù),里面用到了上面聲明的ContentView注解,getAnnotation是得到注解對象,handler是我們的activity傳進(jìn)來的指針,通過指針得到Class類型(這個是類的類)的handlerType,handlerType通過getMethod動態(tài)加載setContentView,setContentView大家都很熟悉就是Android里面的加載布局的函數(shù),然后得到一個Method進(jìn)行反射機(jī)制,實(shí)現(xiàn)函數(shù)加載。

    ? ? ? setContentViewMethod.invoke(handler, contentView.value());這句話也可以這么理解,那就是handler有setContentViewMethod這個方法,setContentViewMethod這個方法的參數(shù)是contentView.value()。

    這樣就明白了為什么這樣

    ? ? @ContentView(R.layout.main)
    ? ? ?public class MyActivity extends FragmentActivity 就可以實(shí)現(xiàn)加載布局的操作了,其他的xUtils的注解操作也是類似的。

    下面是一個簡單流程圖:


    -------------

    更多的Java,Angular,Android,大數(shù)據(jù),J2EE,Python,數(shù)據(jù)庫,Linux,Java架構(gòu)師,:

    http://www.cnblogs.com/zengmiaogen/p/7083694.html



    總結(jié)

    以上是生活随笔為你收集整理的XUtils之注解机制详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。