日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Android注解--初探

 

為什么要學注解

  1. 要想看懂很多開源庫,如Arouter, dagger,Butter Knife等,不得不先看懂注解;
  2. 想更好地提升開發(fā)效率和代碼質(zhì)量,注解可以幫上很大的忙;

本文主要介紹注解開發(fā)的大概概念,算是入個門,如果想實踐,請關注后續(xù)文章

一、什么是注解

JAVA.lang.annotation,接口 Annotation,在JDK5.0及以后版本引入。

注解是代碼里的特殊標記,這些標記可以在編譯、類加載、運行時被讀取,并執(zhí)行相應的處理。通過使用Annotation,開發(fā)人員可以在不改變原有邏輯的情況下,在源文件中嵌入一些補充的信息。代碼分析工具、開發(fā)工具和部署工具可以通過這些補充信息進行驗證、處理或者進行部署。

在運行時讀取需要使用Java反射機制進行處理。

Annotation不能運行,它只有成員變量,沒有方法。Annotation跟public、final等修飾符的地位一樣,都是程序元素的一部分,Annotation不能作為一個程序元素使用。

其實大家都是用過注解的,只是可能沒有過深入了解它的原理和作用,比如肯定見過@Override,@Deprecated等。

1、注解的作用

注解將一些本來重復性的工作,變成程序自動完成,簡化和自動化該過程。比如用于生成Java doc,比如編譯時進行格式檢查,比如自動生成代碼等,用于提升軟件的質(zhì)量和提高軟件的生產(chǎn)效率。

2、注解都有哪些

平時我們使用的注解有來自JDK里包含的,也有Android SDK里包含的,也可以自定義。

2.1、JDK定義的元注解

Java提供了四種元注解,專門負責新注解的創(chuàng)建工作,即注解其他注解。

@target 定義了Annotation所修飾的對象范圍

ElementType.CONSTRUCTOR:用于描述構造器

ElementType.FIELD:用于描述域

ElementType.LOCAL_VARIABLE:用于描述局部變量

ElementType.METHOD:用于描述方法

ElementType.PACKAGE:用于描述包

ElementType.PARAMETER:用于描述參數(shù)

ElementType.TYPE:用于描述類、接口(包括注解類型) 或enum聲明

@retention 定義了該Annotation被保留的時間長短,取值

  • RetentionPoicy.SOURCE:注解只保留在源文件,當Java文件編譯成class文件的時候,注解被遺棄;用于做一些檢查性的操作,比如 @Override 和 @SuppressWarnings
  • RetentionPoicy.CLASS:注解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命周期;用于在編譯時進行一些預處理操作,比如生成一些輔助代碼(如 ButterKnife)
  • RetentionPoicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;用于在運行時去動態(tài)獲取注解信息。

@documented 標記注解,用于描述其它類型的注解應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化,不用賦值。

@inherited 標記注解,允許子類繼承父類的注解。 這里一開始有點理解不了,需要斷句一下,允許子類繼承父類的注解。示例:

Target(value = ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface Sample { 
 public String name() default ""; 
}
@Sample 
class Test{ 
} 
class Test2 extents Test{ 
} 

這樣類Test2其實也有注解@sample 。

2.2 JDK內(nèi)置的其他注解

Android 開發(fā)中經(jīng)常使用各種資源常量 R.XXX 來引用各種資源。例如 圖片資源和字符串資源。這些常量都是 int 類型的,在代碼檢測的時候沒法判斷引用的資源是否有錯誤,比如本來需要一個字符串資源,結果在代碼寫的時候用了一個顏色資源,這種情況只有通過測試才能發(fā)現(xiàn),有些極端情況可能測試也不容易發(fā)現(xiàn)。資源類型注解就是為了解決該問題的,資源注解包含如下幾種:

 

資源類型注解

@AnimatorRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 Animator 類型的資源

@AnimRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 Anim 類型的資源

@AnyRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個任意類型的資源

@ArrayRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 Array 類型的資源

@AttrRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 attribute 類型的資源

@BoolRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個布爾類型的資源

@ColorInt 表明該參數(shù)、變量或者函數(shù)返回值應該是一個顏色值而不是顏色資源引用,例如應該是一個 AARRGGBB 的整數(shù)值。

@ColorRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 color 類型的資源,而不是顏色值。注意和 ColorInt 區(qū)別

@DimenRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 dimension 類型的資源

@DrawableRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 drawable 類型的資源

@FractionRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 fraction 類型的資源

@IdRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個資源的 ID 類型

@IntegerRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個整數(shù)類型的資源

@LayoutRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 layout 布局文件類型的資源

@MenuRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 menu 類型的資源

@PluralsRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 plurals 類型的資源

@RawRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 raw 類型的資源

@StringRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個字符串類型的資源

@StyleableRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 styleable 類型的資源

@StyleRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 style 類型的資源

@TransitionRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 transition 類型的資源

@XmlRes 表明該參數(shù)、變量或者函數(shù)返回值應該是一個 XML 類型的資源

線程注解類型

線程注解用來檢測一個函數(shù)是否在指定類型的線程中執(zhí)行。 有四個:

  • @UiThread
  • @MainThread
  • @WorkerThread
  • @BinderThread

注意: 其中 @UiThread 和 @MainThread 是可替換用的, 大部分應用中,這兩個是一樣的。

如果一個類中的所有函數(shù)都在同一個線程內(nèi)執(zhí)行,可以在 類名稱上面用這個注解即可。

權限注解類型

@RequiresPermission 用來表明該函數(shù)執(zhí)行需要一個或者多個權限,如果你沒有聲明這些權限,則會給出警告。例如:

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
 public abstract void setWallpaper(Bitmap bitmap) throws IOException;
 @RequiresPermission(allOf = {
 Manifest.permission.READ_HISTORY_BOOKMARKS,
 Manifest.permission.WRITE_HISTORY_BOOKMARKS})
 public static final void updateVisitedHistory(ContentResolver cr, String url, boolean real) {
 }
 @RequiresPermission(anyOf = {
 Manifest.permission.READ_HISTORY_BOOKMARKS,
 Manifest.permission.WRITE_HISTORY_BOOKMARKS})
 public static final void updateHistory(ContentResolver cr, String url, boolean real) {
 }

結束

漫漫開發(fā)之路,我們只是其中的一小部分……只有不斷的學習、進階,才是我們的出路!才跟得上時代的進步!

今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統(tǒng)化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。

分享到:
標簽:Android
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定