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