原文:http://blog.csdn.net/rain_butterfly/article/details/37931031
點擊閱讀原文
------------------------------------------------------
這篇文章說一下xUtils里面的注解原理。
? ? ? 先來看一下xUtils里面demo的代碼:
? ? ? ??可能好多人一看就說這是個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.RUNTIME)
? ? @Target(ElementType.ANNOTATION_TYPE)
? ? ?public @interface Target {
? ? ? ? ?ElementType[] value();
? ? ?}
? ? @Target(ElementType.TYPE)???//接口、類、枚舉、注解
? ? @Retention(RetentionPolicy.RUNTIME)定義的這個注解是注解會在class字節碼文件中存在,在運行時可以通過反射獲取到。
? ? @Target({ElementType.TYPE,ElementType.METHOD})因此這個注解可以是類注解,也可以是方法的注解
這樣一個注解就自定義好了,當然注解里面的成員可以為基本的數據類型,也可以為數據,Object等等
大概了解了一下Java注解機制,下面就說一說xUtils里面用到的注解,以及思維流程:以上是ContentView的注解,一些聲明、參數。
? ? ? 以上是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的注解操作也是類似的。
下面是一個簡單流程圖:
-------------
更多的Java,Angular,Android,大數據,J2EE,Python,數據庫,Linux,Java架構師,:
http://www.cnblogs.com/zengmiaogen/p/7083694.html