Java注解
注解實際就是一種元數(shù)據(jù) 為程序元素設(shè)置元數(shù)據(jù) 并且可以對程序執(zhí)行沒有影響初斑。
元數(shù)據(jù)
描述數(shù)據(jù)的數(shù)據(jù) 元數(shù)據(jù)可以為程序元素(如方法匹厘、類等)上添加額外信息侥猬。元數(shù)據(jù)作用大概可以分為三類:
- 編寫文檔:通過代碼里標識的元數(shù)據(jù)生成文檔 比如Javadoc
- 代碼分析:通過代碼里標識的元數(shù)據(jù)對代碼進行分析 比如利用反射獲取代碼中的元數(shù)據(jù)
- 編譯檢查:通過代碼里標識的元數(shù)據(jù)可以讓編譯器實現(xiàn)編譯檢查 比如Java提供的一些注解SuppressWarnings
Annotation類型
根據(jù)使用方法和用途注解可以分為三類:
- 元注解
- 系統(tǒng)內(nèi)置注解
- 自定義注解
元注解
元注解是注解其他注解的注解碧浊。目前Java有5個元注解赶么,他們是:
- Retention
描述注解被保留的時間長短,有三個取值分別是:RetentionPolicy.SOURCE(注解僅存在于源碼中)替久、RetentionPolicy.CLASS( 默認的保留策略凉泄,注解會在class字節(jié)碼文件中存在)、RetentionPolicy.RUNTIME(在運行時可以通過反射獲取到)
如果我們想要通過反射獲取注解那么應(yīng)該使用RetentionPolicy.RUNTIME蚯根。
-
Target
描述注解作用的對象范圍后众。
@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)作用于注解(@Retention注解中就使用該屬性)
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于類型泛型距帅,即泛型方法右锨、泛型類、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 類型使用.可以用于標注任意類型除了 class (jdk1.8加入) Documented
作用是能夠?qū)⒆⒔庵械脑匕?Javadoc 中去碌秸。
- Inherited
一個被@Inherited注解了的注解修飾了一個父類绍移,如果他的子類沒有被其他注解修飾,則它的子類也繼承了父類的注解讥电。
- Repeatable
表示注解可以同時作用一個對象多次蹂窖,但是每次作用注解又可以代表不同的含義。
系統(tǒng)內(nèi)置注解
- SuppressWarnings
告知編譯器忽略特定的異常信息 僅保留在源文件中 - Deprecated
表示該程序元素已過時 用于除注解類型聲明之外的所有元素允趟,保留時長為運行時恼策。 - FunctionalInterface
Java 8 開始支持,標識一個匿名函數(shù)或函數(shù)式接口潮剪。 保留時長為運行時 - override
覆寫父類方法 僅在源文件中保留
Android提供了眾多注解比如@Keep、@NonNull分唾、@Nullable抗碰、@StringRes等等
自定義注解
可以使用 @interface 自定義注解,其中的每一個方法實際上是聲明了一個配置參數(shù)绽乔。方法的名稱就是參數(shù)的名稱弧蝇,返回值類型就是參數(shù)的類型(返回值類型只能是 基本類型、Class折砸、String看疗、enum)∧朗冢可以通過 default 來聲明參數(shù)的默認值两芳。
注解元素必須有確定的值,要么在定義注解的默認值中指定去枷,要么在使用注解時指定怖辆,非基本類型的注解元素的值不可為null是复。因此, 使用空字符串或0作為默認值是一種常用的做法。
注解應(yīng)用
- Apt 注解處理器竖螃,用來在編譯期掃描和處理注解淑廊,通過注解來生成 Java 文件
- 插樁,編譯后處理篩選
- 運行時注解 反射獲取注解