摘要:基本語法我們通過注解的定義來切入注解的語法。跟定義接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解說明了注解所修飾對象的類型。也就是標識該注解可以被繼承。的內置注解重寫了父類的方法表示已過時,不推薦使用。
在Android開發中我們經常會用到注解,例如@Override Butterknife中的BindView等。這里主要記錄下注解怎么寫和簡單的使用。
基本語法我們通過Override注解的定義來切入注解的語法。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
在java源碼中,通過上面的幾行代碼就定義了一個Override的注解,定義注解的時候用到了兩個元注解Target,Retention。什么是元注解?注解注解的注解就是元注解。跟定義接口差不多,就是用到的是@interface,然后加上了元注解。那么元注解的作用是什么呢?
元注解元注解:@Target,@Retention,@Documented,@Inherited
@Target@Target說明了注解所修飾對象的類型。由EelmentType所描述
public enum ElementType { TYPE, //class interface enum FIELD, //域 METHOD, //方法 PARAMETER, //參數 CONSTRUCTOR, //構造 LOCAL_VARIABLE, //局部變量 ANNOTATION_TYPE, //注解 PACKAGE, //包 }
實例:
/** * 這樣我們就定義了一個作用在類型和域上面的注解 */ @Target({ElementType.TYPE, ElementType.FIELD}) public @interface Entity { }@Retention
@Retention 表明注解作用的時間。由RetentionPolicy所描述
public enum RetentionPolicy { /** * 只在源碼顯示,編譯時丟棄; */ SOURCE, /** * 編譯時記錄到.class中,運行時忽略;默認值 */ CLASS, /** * 運行時保留,運行中可以處理。(我們用的較多的就是這個) */ RUNTIME }@Documented
含有該注解類型的元素(帶有注釋的)會通過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生成文檔后顯示如下:
根據字面意思是繼承。也就是標識該注解可以被繼承。只作用在類上面。
注解參數@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Entity { String value() default ""; int name() default 0; }
我們在定義注解的時候,可以添加相關的參數。定義了參數之后我們就可以通過反射的方式獲取到注解,然后獲取該參數了。如下所示:
ClasscClass = 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,及前邊這些類型的數組類型。
Java的內置注解@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();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68797.html
摘要:不包含父類或父接口的方法返回,根據方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數和返回值。打印打印拋出因為的訪問權限為拋出,因為是父類的方法。 反射機制呢就是在程序運行時,動態的獲取類(class),類的方法(method)屬性(field)等。主要的注意點就是程序運行時動態的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...
摘要:谷歌表示,與搜索并列,是谷歌機器學習技術最重要的產品服務載體。谷歌宣布了基于機器學習技術的全面升級,很可能是其誕生以來的最大升級。在去年的大會上,谷歌宣布了其第一代。 showImg(https://segmentfault.com/img/bVNTKT?w=900&h=385); Google I/O Google I/O 是由 Google 舉行的網絡開發者年會,討論的焦點是用 G...
閱讀 2368·2021-11-18 10:07
閱讀 2318·2021-09-22 15:59
閱讀 3077·2021-08-23 09:42
閱讀 2276·2019-08-30 15:44
閱讀 1191·2019-08-29 15:06
閱讀 2303·2019-08-29 13:27
閱讀 1210·2019-08-29 13:21
閱讀 1412·2019-08-29 13:13