Android 常用注解介紹及注解聲明

一、常用注解

開發(fā)中經(jīng)常使用到注解,例如Android自帶的 IntDef、StringDef、NonNull、Nullable、ColorRes(其他的XxxRes)、IntRange、Size、等,這只是一些有代表性的注解,還有一些第三方的注解比如Gson的SerializedName設(shè)置多個(gè)別名、Butterknife的BindView等等。大大提升了開發(fā)的效率以及可讀性。

1. XxxDef 類型定義注解,其中包括IntDef、StringDef、LongDef。使用這種方式注解可以代替枚舉來實(shí)現(xiàn)限制類型&聲明常量

@IntDef({ConversationType.NONE,ConversationType.PRIVATE_B2C,ConversationType.PRIVATE_C2C, ConversationType.GROUP})
    //注解的作用目標(biāo) 在方法參數(shù)、字段、方法中出現(xiàn)
    @Target({
            ElementType.PARAMETER,
            ElementType.FIELD,
            ElementType.METHOD,
    })
    //注解僅存在于源碼中,在class字節(jié)碼文件中不包含
    @Retention(RetentionPolicy.SOURCE)
    //聲明注解
    public @interface ConversationType {
        int NONE = 0;
        int PRIVATE_B2C = 1;
        int PRIVATE_C2C = 2;
        int GROUP = 3;
    }

2. NonNull標(biāo)記參數(shù)或者返回不可以為空,Nullable標(biāo)記參數(shù)或者返回值可以為空

3. XxxRes 資源類型注解(指定為對(duì)應(yīng)的類型)

@AnimatorRes ----android.R.animator
@AnimRes-----android.R.anim
@ArrayRes----android.R.array
@AttrRes-----android.R.attr
@BoolRes----bool類型
@ColorRes-----android.R.color
@DrawableRes ----android.R.drawable
@IdRes----android.R.id
@IntegerRes----android.R.integer
@LayoutRes----android.R.layout
@MenuRes----android.R.menu
@RawRes----android.R.raw
@StringRes---android.R.string
@StyleableRes----android.R.styleable
@XmlRes---android.R.xml

4. 線程注解

@UiThread
@MainThread
@WorkerThread (后臺(tái)線程)
@BinderThread(binder線程)

5. 值范圍注解(防止傳入錯(cuò)誤參數(shù),有三種注解)

  • @Size 類似數(shù)組、集合、字符串
    @Size(min = 1)//可以表示集合不可為空
    @Size(max = 23)//可以表示最大字符個(gè)數(shù)為23
    @Size(2)可以表示數(shù)組元素個(gè)數(shù)為2個(gè)
    @Size(multiple = 2)//可以表示數(shù)組大小是2的倍數(shù)
    
  • @IntRange 參數(shù)類型為int或者long
    public void setValue(@IntRange(from=0,to= 10) int value){}
    
  • @FloatRange 參數(shù)為float或者double

6. @Keep 用來標(biāo)記在[Proguard]混淆過程中不需要混淆的類和方法

7. 權(quán)限注解(為了在編譯期發(fā)現(xiàn)權(quán)限的缺失 ,可以使用@RequiresPermission注解)

//1.如果調(diào)用函數(shù)需要聲明一個(gè)權(quán)限
@RequiresPermission(Manifest.permission.SET_WALLPAPER)
//2.如果調(diào)用函數(shù)需要聲明集合中至少一個(gè)權(quán)限
@RequiresPermission(anyOf = { Manifest.permission.ACCESS_COARSE_LOCATION,}Manifest.permission.ACCESS_FINE_LOCATION)
//3.如果調(diào)用函數(shù)需要同時(shí)聲明多個(gè)權(quán)限
@RequiresPermission(allOf = {Manifest.permission.ACCESS_COARSE_LOCATION,}Manifest.permission.ACCESS_FINE_LOCATION)

常用注解到此就介紹完畢,接下來我們看看如何聲明自己的注解

二、聲明注解

首先必須介紹一下Java中的元注解,元注解是什么呢?就是注解的注解!包括@Retention、@Target、@Document、@Inherite四種。

  1. @Retention:定義注解的保留策略
//注解僅存在于源碼中,在class字節(jié)碼文件中不包含
@Retention(RetentionPolicy.SOURCE)
// 默認(rèn)的保留策略,注解會(huì)在class字節(jié)碼文件中存在,但運(yùn)行時(shí)無法獲得
@Retention(RetentionPolicy.CLASS)
// 注解會(huì)在class字節(jié)碼文件中存在,在運(yùn)行時(shí)可以通過反射獲取到
@Retention(RetentionPolicy.RUNTIME)
  1. @Target:定義注解的作用目標(biāo)
@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) ///包
  1. @Document:說明該注解將被包含在javadoc
  2. @Inherited:說明子類可以繼承父類中的該注解

如有誤點(diǎn),多多指教 喜歡呦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容