摘要:基本語法我們通過注解的定義來切入注解的語法。跟定義接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解說明了注解所修飾對象的類型。也就是標(biāo)識該注解可以被繼承。的內(nèi)置注解重寫了父類的方法表示已過時,不推薦使用。
在Android開發(fā)中我們經(jīng)常會用到注解,例如@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, //參數(shù) CONSTRUCTOR, //構(gòu)造 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生成文檔后顯示如下:
根據(jù)字面意思是繼承。也就是標(biāo)識該注解可以被繼承。只作用在類上面。
注解參數(shù)@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Entity { String value() default ""; int name() default 0; }
我們在定義注解的時候,可以添加相關(guān)的參數(shù)。定義了參數(shù)之后我們就可以通過反射的方式獲取到注解,然后獲取該參數(shù)了。如下所示:
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); }
注解參數(shù)的類型包括:基本數(shù)據(jù)類型,String,Class,Enum,Annotation,及前邊這些類型的數(shù)組類型。
Java的內(nèi)置注解@Override 重寫了父類的方法
@Deprecated 表示已過時,不推薦使用。一般在使用被標(biāo)注的方法、類等時編輯器會出現(xiàn)刪除線。
@@SuppressWarnnings 用于通知Java編譯器關(guān)閉對特定類、方法、成員變量、變量初始化的警告
compile "com.android.support:support-annotations:24.2.0"
support-annotations包為我們提供了很多實用的注解,來方便代碼的檢查,例如 @Nullable ,@NonNull等,具體的使用參考Android官方文檔。
這里說一下類型的定義IntDef和StringDef,在開發(fā)中經(jīng)常要使用Enum類型。不過Enum在開發(fā)中性能不如常量。我們可以使用注解的方式進行替換。例如下面是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();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68797.html
摘要:不包含父類或父接口的方法返回,根據(jù)方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數(shù)和返回值。打印打印拋出因為的訪問權(quán)限為拋出,因為是父類的方法。 反射機制呢就是在程序運行時,動態(tài)的獲取類(class),類的方法(method)屬性(field)等。主要的注意點就是程序運行時動態(tài)的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...
摘要:中的詳解必修個多線程問題總結(jié)個多線程問題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 基于 POI 封裝 ExcelUtil 精簡的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對于 ...
摘要:谷歌表示,與搜索并列,是谷歌機器學(xué)習(xí)技術(shù)最重要的產(chǎn)品服務(wù)載體。谷歌宣布了基于機器學(xué)習(xí)技術(shù)的全面升級,很可能是其誕生以來的最大升級。在去年的大會上,谷歌宣布了其第一代。 showImg(https://segmentfault.com/img/bVNTKT?w=900&h=385); Google I/O Google I/O 是由 Google 舉行的網(wǎng)絡(luò)開發(fā)者年會,討論的焦點是用 G...
閱讀 2450·2021-11-18 10:07
閱讀 2397·2021-09-22 15:59
閱讀 3152·2021-08-23 09:42
閱讀 2365·2019-08-30 15:44
閱讀 1253·2019-08-29 15:06
閱讀 2423·2019-08-29 13:27
閱讀 1294·2019-08-29 13:21
閱讀 1513·2019-08-29 13:13