中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Annotation注解及元注解

發布時間:2020-05-06 21:44:04 來源:網絡 閱讀:7645 作者:一劍圍城 欄目:開發技術

在使用許多第三方框架的時候,查閱源碼如ButterKnife等。發現許多注解的使用,頓時覺得注解都玩不溜怎么稱霸武林。當然無論Java還是AndroidSDK中都有大量注解的使用,以前總是走馬觀花,印象中知道注解代表的意思,但開口總是說不清道不明,唯有總結方得始終。

注解是附加在代碼中的一些信息,可以幫助一些代碼分析工具如Lint分析代碼,輔助開發者改善代碼,對于開發者來說有個提示、警告的作用。但注解不會改變代碼邏輯。在此總結了幾個Android開發常見的注解的解釋,以及對元注解的基本認識。


常見的幾個注解

1@TargetApi

2@RequiresApi

3@suppressLint

4@SuppressWarnings


@TargetApi(Build.VERSION_CODES.M)@TargetApi(23)

Lint會按照API版本M以上掃描代碼,而不是project中指定的minSDKVersion,可以使得高版本Api在低版本SDKLint不報錯。如果只加這個注解,表明這段代碼只能在23及以上的系統上運行,如果你非要在23以下的系統上運行,那該警告的已經警告了,你只是忽略了警告,但運行時該錯還是錯。


@RequiresApi(api = Build.VERSION_CODES.M)

表示注解目標只能夠在指定的版本API及以上運行,消除高版本Api在低版本SDK上的報錯,作用上和TargetApi相同,只是在詞面上更清楚表達了這是一個建議,而不僅僅是為了消除高版本Api在低版本SDK上的報錯。從官方的表述可以看出更推薦使用RequiresApi替換TargetApi


@SuppressLint("NewApi")

最直接暴力屏蔽指定名稱的報錯,這里的NewApi對應的具體錯誤名稱是:Calling new methods on older versions。這里的NewApi只是一個縮寫名稱。相比于@TargetApi指定了版本號,SuppressLint是一律屏蔽,所以一般不建議使用。當然還可以指定任何其他Lint定義好的錯誤名稱。在settings中查找Inspections可以找到預先定義好的所有ErrorWarning。對于多個錯誤,使用逗號隔開。

XML中類似的做法有:

tools:ignore="ScrollViewCount,UselessParent"忽略XML中的兩個警告。


@SuppressWarnings("NumericOverflow")

屏蔽NumericOverflow警告,如:int a = 1 / 0;

一般的語句注解方式suppress for statement 

    @SuppressWarnings("NumericOverflow")

     int a = 10 / 0;

注釋注解方式statement for statement with comment

     //noinspection NumericOverflow(以前總是看到這樣的注釋,但并不知道也是注解)

     int a = 10 / 0;

當然,這些注解可以使用在許多地方如:classmethodstatement,分別對應由大到小不同的作用域類、方法、語句,當然作用域范圍越大,那么性能損耗自然越大。


Annotation不影響代碼邏輯

這些注解的作用只是去除Lint的錯誤警告,并不能影響任何的代碼邏輯。

所以必須在代碼中添加相應的兼容性判斷代碼,如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

      color = getColor(R.color.colorAccent);

}

當然,當你添加完上述兼容代碼后,警告也就消失了。


元注解(注解的注解)

常見的元注解:

1@Documented

2@Inherited

3@Retention

4@Target

分析SuppressLint的定義:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.CLASS)

public @interface SuppressLint {

 value();

}

@Target定義作用目標

其中@Target指定了SuppressLint的作用目標,具體TYPEFIELD等代表什么,可以在java.lang.annotation.ElementType里面找到。

例如:TYPE表示

/** Class, interface (including annotation type), or enum declaration */

即包含了類、接口(包括注解)、枚舉類型。

例如:@Override注解

@Target(ElementType.METHOD)  重寫,只能作用于方法

@Retention(RetentionPolicy.SOURCE)  只存在于編碼階段,編譯階段就失效了

public @interface Override {}


@Retention定義保留策略

1PetentionPolicy.SOURCE 僅保留在源碼階段,編譯階段就失效

2PetentionPolicy.CLASS默認策略,會保留到編譯出字節碼階段,運行時失效

3PetentionPolicy.RUNTIME 保留到VM的運行時階段,可通過反射獲得


@Documented   注解將被寫入javadoc

@Inherited   子類可以繼承父類中的該注解

@Repeatable   找不到例子,有待理解

@Native   尚處于Preview狀態,表示常量有可能被本地代碼引用


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滦平县| 合山市| 沁阳市| 报价| 福建省| 绥阳县| 呼和浩特市| 乌拉特中旗| 温泉县| 印江| 寿光市| 嘉定区| 运城市| 积石山| 黔江区| 南丹县| 封丘县| 巍山| 北海市| 新宁县| 德惠市| 个旧市| 中卫市| 宁津县| 河北区| 湘西| 新邵县| 巴彦淖尔市| 富源县| 原阳县| 玛纳斯县| 长葛市| 云南省| 三河市| 大理市| 肇源县| 九寨沟县| 泽州县| 卢龙县| 三明市| 扎赉特旗|