Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 最火的快速開發框架XUtils之注解機制詳解

Android 最火的快速開發框架XUtils之注解機制詳解

編輯:關於Android編程

在上一篇文章Android 最火的快速開發框架XUtils中簡單介紹了xUtils的基本使用方法,這篇文章說一下xUtils裡面的注解原理。

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

@ViewInject(R.id.tabhost)
    private FragmentTabHost mTabHost;
@ViewInject(R.id.big_img)
    private ImageView bigImage;

可能好多人一看就說這是個what,其實這是Java core裡面的內容,做JavaEE的應該很熟悉,像著名的spring框架就用了大量的注解。那到底什麼是注解呢?下面詳細講解一下Java注解:

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

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

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


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

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

    1、元注解

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

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

    @Retention(RetentionPolicy.SOURCE)//注解僅存在於源碼中,在class字節碼文件中不包含 @Retention(RetentionPolicy.CLASS)// 默認的保留策略,注解會在class字節碼文件中存在,但運行時無法得 @Retention(RetentionPolicy.RUNTIME)// 注解會在class字節碼文件中存在,在運行時可以通過反射獲取到
    1.2、@Target:定義注解的作用目標
    其定義的源碼為: @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) //方法參數 @Target(ElementType.CONSTRUCTOR) //構造函數 @Target(ElementType.LOCAL_VARIABLE)//局部變量 @Target(ElementType.ANNOTATION_TYPE)//注解 @Target(ElementType.PACKAGE) ///包 其中的@interface是一個關鍵字,在設計annotations的時候必須把一個類型定義為@interface,而不能用class或interface關鍵字,由以上的源碼可以知道,他的elementType 可以有多個,一個注解可以為類的,方法的,字段的等等。
    1.3、@Document:說明該注解將被包含在javadoc中 1.4、@Inherited:說明子類可以繼承父類中的該注解
    2、java 注解的自定義
    下面是自定義注解的一個例子

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

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

    這樣一個注解就自定義好了,當然注解裡面的成員可以為基本的數據類型,也可以為數據,Object等等

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

    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的注解,一些聲明、參數。

     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裡面的一個靜態注解對象函數,裡面用到了上面聲明的ContentView注解,getAnnotation是得到注解對象,handler是我們的activity傳進來的指針,通過指針得到Class類型(這個是類的類)的handlerType,handlerType通過getMethod動態加載setContentView,setContentView大家都很熟悉就是Android裡面的加載布局的函數,然後得到一個Method進行反射機制,實現函數加載。

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

    這樣就明白了為什麼這樣

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

    下面是一個簡單流程圖:


    如有問題請留言,轉載注明出處。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved