XUtils之注解機制詳解

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

點擊閱讀原文

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

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

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

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. @ViewInject(R.id.tabhost)??
  2. ????private?FragmentTabHost?mTabHost;??
  3. @ViewInject(R.id.big_img)??
  4. ????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里面用到的注解,以及思維流程:

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. package?com.lidroid.xutils.view.annotation;??
  2. ??
  3. import?java.lang.annotation.ElementType;??
  4. import?java.lang.annotation.Retention;??
  5. import?java.lang.annotation.RetentionPolicy;??
  6. import?java.lang.annotation.Target;??
  7. ??
  8. @Target(ElementType.TYPE)??
  9. @Retention(RetentionPolicy.RUNTIME)??
  10. public?@interface?ContentView?{??
  11. ????int?value();??
  12. }??
以上是ContentView的注解,一些聲明、參數。

[java]?view plaincopy
print?在CODE上查看代碼片派生到我的代碼片
  1. private?static?void?injectObject(Object?handler,?ViewFinder?finder)?{??
  2. ??
  3. ???????Class<?>?handlerType?=?handler.getClass();??
  4. ??
  5. ???????//?inject?ContentView??
  6. ???????ContentView?contentView?=?handlerType.getAnnotation(ContentView.class);??
  7. ???????if?(contentView?!=?null)?{??
  8. ???????????try?{??
  9. ???????????????Method?setContentViewMethod?=?handlerType.getMethod("setContentView",?int.class);??
  10. ???????????????setContentViewMethod.invoke(handler,?contentView.value());??
  11. ???????????}?catch?(Throwable?e)?{??
  12. ???????????????LogUtils.e(e.getMessage(),?e);??
  13. ???????????}??
  14. ???????}}??

? ? ? 以上是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



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle ko16mswin949,mysql字符集 - osc_wq7ij8li的個人空間 - OSCHINA - 中文開源技術交流社區...

恰當的字符集&#xff0c;暢快的體驗&#xff01;00、Oracle字符集Subsets and Supersets #子集與超集Table A-11 Subset-Superset PairsSubset(子集)Superset(超集)AR8ADOS710AR8ADOS710TAR8ADOS720AR8ADOS720TAR8ADOS720TAR8ADOS720AR8APTEC715AR8APTEC715TAR8ARABICMACTAR…

曼徹斯特編碼_兩種編碼方式以及兩種幀結構

一、不歸零制編碼(Non-Return to Zero)對于不歸零制編碼是最簡單的一種編碼方式&#xff0c;正電平代表1&#xff0c;負電平代表0。如下圖&#xff1a;其實在不歸零制編碼中有一個很明顯的缺陷&#xff0c;那就是它不是自同步碼。對于上圖&#xff0c;你知道它傳輸的數據是什么…

python用一行代碼編寫一個回聲程序_使用Python的多回聲測驗

我在寫一個程序來管理一個五問多的問題- 關于全球變暖的選擇測驗和計算數字 正確答案。 我首先創建了一本字典&#xff0c;比如&#xff1a;questions \ { "What is the global warming controversy about?": { "A": "the public debate over wheth…

iOS開發學習路線

iOS開發學習路線 前言 這里筑夢師,是一名正在努力學習的iOS開發工程師,目前致力于全棧方向的學習,希望可以和大家一起交流技術,共同進步,用簡書記錄下自己的學習歷程. 個人學習方法分享本文閱讀建議 1.一定要辯證的看待本文. 2.本文主要是本人對iOS開發經驗中總結的知識點 3.本…

Android快速開發框架XUtils

原文地址&#xff1a;http://blog.csdn.net/rain_butterfly/article/details/37812371 點擊閱讀原文 -------------------------------------------- https://github.com/wyouflf/xUtils https://github.com/wyouflf/xUtils3 XUtils是基于afinal開發的&#xff0c;比afina…

oracle查看序列數據語法,oracle查詢各種數據字典的語法

ORACLE的數據字典是數據庫的重要組成部分之一&#xff0c;它隨著數據庫的產生而產生, 隨著數據庫的變化而變化&#xff0c;體現為sys用戶下的一些表和視圖。數據字典名稱是大寫的英文字符。數據字典里存有用戶信息、用戶的權限信息、所有數據對象信息、表的約束條件、統計分析數…

如何安裝python3.8.1_python3.8.1 安裝

Loading...請注意&#xff0c;本文編寫于 217 天前&#xff0c;最后修改于 217 天前&#xff0c;其中某些信息可能已經過時。系統環境&#xff1a;centos 7 安裝依賴項 bash yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-d…

明年新iphone使用增強版5nm芯片_蘋果A15芯片或將采用臺積電5nm+工藝!性能提升極強...

今年蘋果的iPhone 12系列搭載的A14 仿生芯片是今年智能手機市場推出的第一款5nm工藝處理器&#xff0c;處理器的性能也是用戶有目共睹的&#xff0c;相較于之前的芯片性能提升了一大截&#xff0c;有眾多網友也表示&#xff1a;蘋果芯片最大的敵人就是上一代的自己。當然&#…

php中dump怎么使用,php – 如何正確使用print_r或var_dump?

我在調試時經常使用以下代碼段&#xff1a;echo "" . var_dump($var) . "";而且我發現我通常會得到一個很好的可讀輸出.但有時我卻不這樣做.這個例子我現在特別煩惱&#xff1a;$usernamexxxxxx;$passwordxxxxxx;$data_urlhttp://docs.tms.tribune.com/tec…

Spring Framework 5 中的新特性

https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spring 5 于 2017 年 9 月發布了通用版本 (GA)&#xff0c;它標志著自 2013 年 12 月以來第一個主要 Spring Framework 版本。它提供了一些人們期待已久的改進&#xff0c;還…

怎么計算一組數據的波動_稅控盤數據和小規模增值稅申報表計算結果不一致怎么辦...

a公司為小規模納稅人&#xff0c;于2020年1月申報2019年第四季度增值稅時&#xff0c;是按照金稅盤的數據實際銷售金額為562,563,13元&#xff0c;實際銷售稅額為16,876.87元填寫小規模納稅人增值稅申報表。申報成功后&#xff0c;稅務系統卻跳出比對異常&#xff0c;戶管員要求…

簡單又好看的按鈕,扁平化按鈕。

原文地址&#xff1a;http://blog.csdn.net/peijiangping1989/article/details/19333779 點擊閱讀原文 ----------------------------------------------------------- 今天分享一下流行的扁平化按鈕。完全不需要用到圖片哦。效果圖如下&#xff1a; 里面有2個按鈕都是一樣的…

python輸入三行、能出來三行數據_python 讀入多行數據的實例

一、前言本文主要使用python 的raw_input() 函數讀入多行不定長的數據&#xff0c;輸入結束的標志就是不輸入數字情況下直接回車&#xff0c;并填充特定的數作為二維矩陣二、代碼def get2dlistdata():res []inputline raw_input() #以字符串的形式讀入一行#如果不為空字符串作…

請問,現在android流行什么開源框架?

retrofit2.0RxjavagreenDao3大流行圖片庫p,g,f&#xff08;Picasso&#xff0c;Fresco&#xff0c;Glide&#xff09; 3分鐘全面了解Android主流圖片加載庫 http://blog.csdn.net/carson_ho/article/details/51939774 Retrofit2使用&#xff08;非常簡潔易懂&#xff09; ht…

matlab 銳化降噪,matlab 圖形銳化 濾波

help imreadhelp fspecial imfilt幫助穩定中有較多的示例fspecial 函數功能&#xff1a;產生預定義濾波器格式&#xff1a;Hfspecial(type)Hfspecial(gaussian,n,sigma) 高斯低通濾波器Hfspecial(sobel) Sobel 水平邊緣增強濾波器Hfspecial…

執行 link.exe 時出錯_在20多歲時應該做什么,以避免在30多歲和40多歲時后悔?...

1. 永遠不要以為自己可以&#xff0c;將會或曾經到達過以為是錯誤的。無論是幸福&#xff0c;收入還是心態。在二十多歲的關鍵時期&#xff0c;我有這種心態&#xff0c;對我自己不利。認為自己“實現”是一種靜態的世界觀&#xff0c;阻礙了您的成長。接受這樣的事實&#xff…

音頻自動增益 與 靜音檢測 算法 附完整C代碼

前面分享過一個算法《音頻增益響度分析 ReplayGain 附完整C代碼示例》 主要用于評估一定長度音頻的音量強度&#xff0c; 而分析之后&#xff0c;很多類似的需求&#xff0c;肯定是做音頻增益&#xff0c;提高音量諸如此類做法。 不過在項目實測的時候&#xff0c;其實真的很難…

python繪制餅狀圖圖例_使用matplotlib的所有餅圖的通用圖例

圖例只需調用一次&#xff0c;否則將顯示7個不同的圖例。我在下面展示了一個例子。請注意&#xff0c;您必須將自己的數據替換為ax.pie()&#xff1a;data1 (10,90) # some data to be plotted data2 (40,50) data3 (70,30) labels [Sending Data, Not Sending Data] #lege…

Android初始化本地數據庫

原文&#xff1a;http://blog.csdn.net/itjavawfc/article/details/50860647 點擊閱讀原文 -------------------------------- 最近遇到一個需求&#xff0c;一個同學不會搭服務器&#xff0c;但是Android課程設計需要用到很多數據&#xff0c;這樣就出現了一個問題&#xff0c…

jsp springmvc 視圖解析器_springMVC配置jsp/html視圖解析器

1、maven項目引入freemark相關jar包freemaker是以個模板引擎&#xff0c;可以根據提供的數據和創建好的模板,去自動的創建html靜態頁面。所以在返回html視圖時可以用這個引擎結合數據生成html靜態頁面。org.springframeworkspring-context-support5.0.7.RELEASEorg.freemarkerf…