在Android開發中咱們常常會用到註解,例如@Override
Butterknife中的BindView
等。這裏主要記錄下註解怎麼寫和簡單的使用。html
咱們經過Override
註解的定義來切入註解的語法。java
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
在java源碼中,經過上面的幾行代碼就定義了一個Override
的註解,定義註解的時候用到了兩個元註解Target
,Retention
。什麼是元註解?註解註解的註解就是元註解。跟定義接口差很少,就是用到的是@interface
,而後加上了元註解。那麼元註解的做用是什麼呢?android
元註解:@Target
,@Retention
,@Documented
,@Inherited
數組
@Target說明了註解所修飾對象的類型。由EelmentType
所描述編輯器
public enum ElementType { TYPE, //class interface enum FIELD, //域 METHOD, //方法 PARAMETER, //參數 CONSTRUCTOR, //構造 LOCAL_VARIABLE, //局部變量 ANNOTATION_TYPE, //註解 PACKAGE, //包 }
實例:ide
/** * 這樣咱們就定義了一個做用在類型和域上面的註解 */ @Target({ElementType.TYPE, ElementType.FIELD}) public @interface Entity { }
@Retention
代表註解做用的時間。由RetentionPolicy
所描述工具
public enum RetentionPolicy { /** * 只在源碼顯示,編譯時丟棄; */ SOURCE, /** * 編譯時記錄到.class中,運行時忽略;默認值 */ CLASS, /** * 運行時保留,運行中能夠處理。(咱們用的較多的就是這個) */ RUNTIME }
含有該註解類型的元素(帶有註釋的)會經過javadoc或相似工具進行文檔化。
咱們來對比一下:性能
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoDocumented { } @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestDocumented { } @TestDocumented public void funTestDocumented(){ System.out.println("有@Documented"); } @NoDocumented public void funNoDocucmented(){ System.out.println("無@Documented"); }
定義以上兩個註解並測試,利用javadoc生成文檔後顯示以下:
測試
根據字面意思是繼承。也就是標識該註解能夠被繼承。只做用在類上面。spa
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Entity { String value() default ""; int name() default 0; }
咱們在定義註解的時候,能夠添加相關的參數。定義了參數以後咱們就能夠經過反射的方式獲取到註解,而後獲取該參數了。以下所示:
Class<TestInheritedC> cClass = TestInheritedC.class; Entity annotation = cClass.getAnnotation(Entity.class); if (annotation != null) { String value = annotation.value(); int name = annotation.name(); System.out.println("value = " + value + " name = " + name); }
註解參數的類型包括:基本數據類型
,String
,Class
,Enum
,Annotation
,及前邊這些類型的數組類型
。
@Override 重寫了父類的方法
@Deprecated 表示已過期,不推薦使用。通常在使用被標註的方法、類等時編輯器會出現刪除線。
@@SuppressWarnnings 用於通知Java編譯器關閉對特定類、方法、成員變量、變量初始化的警告
compile 'com.android.support:support-annotations:24.2.0'
support-annotations
包爲咱們提供了不少實用的註解,來方便代碼的檢查,例如 @Nullable
,@NonNull
等,具體的使用參考Android官方文檔。
這裏說一下類型的定義IntDef
和StringDef
,在開發中常常要使用Enum
類型。不過Enum
在開發中性能不如常量。咱們能夠使用註解的方式進行替換。例以下面是View
源碼中的一個栗子
@IntDef({VISIBLE, INVISIBLE, GONE}) @Retention(RetentionPolicy.SOURCE) public @interface Visibility {}
借用官方文檔上的栗子,是這麼使用的:
// Define the list of accepted constants and declare the NavigationMode annotation @Retention(RetentionPolicy.SOURCE) @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) public @interface NavigationMode {} // Declare the constants public static final int NAVIGATION_MODE_STANDARD = 0; public static final int NAVIGATION_MODE_LIST = 1; public static final int NAVIGATION_MODE_TABS = 2; // Decorate the target methods with the annotation @NavigationMode public abstract int getNavigationMode();