java中元注解有四個: @Retention @Target @Document @Inherited;
@Retention:注解的保留位置 @Retention(RetentionPolicy.SOURCE) //注解僅存在于源碼中,在class字節碼文件中不包含@Retention(RetentionPolicy.CLASS) // 默認的保留策略,注解會在class字節碼文件中存在,但運行時無法獲得,@Retention(RetentionPolicy.RUNTIME) // 注解會在class字節碼文件中存在,在運行時可以通過反射獲取到 @Target:注解的作用目標 @Target(ElementType.TYPE) //類、接口(包括注解類型) 或enum聲明@Target(ElementType.FIELD) //字段、枚舉的常量@Target(ElementType.METHOD) //方法@Target(ElementType.PARAMETER) //方法參數@Target(ElementType.CONSTRUCTOR) //構造函數@Target(ElementType.LOCAL_VARIABLE)//局部變量@Target(ElementType.ANNOTATION_TYPE)//注解@Target(ElementType.PACKAGE) ///包@Document:說明該注解將被包含在javadoc中,沒有成員。
@Inherited:說明子類可以繼承父類中的該注解
說明:
Java內置了四種元注解。或許你要問了,這四種元注解又是哪里來的呢?我們來看看這三種元注解,得到的答案是每一種元注解又是建立在四個元注解的基礎之上的。有點自己定義自己的意思。什么時候使用這四個元注解?僅僅在你需要定義自己的注解類時。什么時候使用自定義注解類或Java內置的幾個標準注解類?當然是在普通Java類(指的是不是注解類的類如MetaAnnotation,有時候我也叫它被注解類)里使用。需要記住的是,普通Java類里并不能直接使用元注解,如果你在MetaAnnotation上面加上@Documented,肯定編譯報錯。@Target未指定任何參數的話,代表八種都包括。有一類事物,就可以定義一套元數據。 元數據(MetaData)相當于描述一類事物的屬性列表,并且是標準的。 參考: 元數據(MetaData) - 阮一峰的網絡日志
Inherited作用是,使用此注解聲明出來的自定義注解,在使用此自定義注解時,如果注解在類上面時,子類會自動繼承此注解,否則的話,子類不會繼承此注解。這里一定要記住,使用Inherited聲明出來的注解,只有在類上使用時才會有效,對方法,屬性等其他無效。
參考: 關于java 注解中元注解Inherited的使用詳解 - 雪峰的專欄 - 博客頻道 - CSDN.NET Java注解學習四:@Inherited的使用 - zy19982004 - ITeye技術網站
@Documented,則它會被 javadoc 之類的工具處理, 所以注解類型信息也會被包括在生成的文檔中.javadoc中的@author、@version、@param、@return、@dePRecated、@hide、@throws、@exception、@see是標記,并不是注解;參考: Java注解之Retention、Documented、Inherited介紹 - u013111003的博客 - 博客頻道 - CSDN.NET Android studio JavaDoc的使用
isAnnotationPresent:檢驗是否存在該注解
isAnnotationPresentboolean isAnnotationPresent(Class<? extends Annotation> annotationClass)如果指定類型的注釋存在于此元素上,則返回 true,否則返回 false。此方法主要是為了便于訪問標記注釋而設計的。
參數:annotationClass - 對應于注釋類型的 Class 對象返回:如果指定注釋類型的注釋存在于此對象上,則返回 true,否則返回 false拋出:NullPointerException - 如果給定的注釋類為 nullgetAnnotation:獲取注解
getAnnotation<T extends Annotation> T getAnnotation(Class<T> annotationClass)如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
參數:annotationClass - 對應于注釋類型的 Class 對象返回:如果該元素的指定注釋類型的注釋存在于此對象上,則返回這些注釋,否則返回 null拋出:NullPointerException - 如果給定的注釋類為 nullgetAnnotations:獲取所有注解
getAnnotationsAnnotation[] getAnnotations()返回此元素上存在的所有注釋。(如果此元素沒有注釋,則返回長度為零的數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
返回:此元素上存在的所有注釋getDeclaredAnnotations:獲取除繼承之外的所有注解,也就是直接存在于此元素上的所有注解。
getDeclaredAnnotationsAnnotation[] getDeclaredAnnotations()返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
返回:直接存在于此元素上的所有注釋java注解 - YangYiBao - 博客園 Java基礎筆記 – Annotation注解的介紹和使用 自定義注解 | IT宅.com
Java注解學習三:package-info.java的使用 - zy19982004 - ITeye技術網站 另類的package-info.java文件探討 - - ITeye技術網站
在Android Studio中創建package-info.java: The best workaround is to right click on the package, New, File, and create a file called package-info.java. Once it’s there the IDE will recognize it as a Java file and you’ll get the syntax highlighting and such. How to create package-info.java in Android Studio - Stack Overflow
Annotation類型里面的參數該怎么設定:
第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這里把方法設為defaul默認類型; 第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這里的參數成員就為String; 第三,如果只有一個參數成員,最好把參數名稱設為”value”,后加小括號.例:下面的例子FruitName注解就只有一個參數成員。 第四,當注解中使用的屬性名為value時,對其賦值時可以不指定屬性的名稱而直接寫上屬性值接口;除了value意外的變量名都需要使用name=value的方式賦值。一小時搞明白自定義注解(Annotation) - 顧明偉 - 博客頻道 - CSDN.NET java自定義注解 - 永生 - ITeye技術網站 zy19982004的博客 - Java基礎分類文章列表 - ITeye技術網站 深入理解Java:注解 - 牛奶、不加糖 - 博客園
Java中的注解是如何工作的? - ImportNew http://www.importnew.com/10294.html
Android開發過程中使用到的注解主要來自如下幾個地方:
Android SDK:在包android.annotation下;
Android Annotation Support包:在包android.support.annotation下;
JDK:在包java.lang下;
第三方框架中的自定義注解
屬于標記注解,不需要設置屬性值;只能添加在方法的前面,用于標記該方法是復寫的父類中的某個方法,如果在父類沒有的方法前面加上@Override注解,編譯器會報錯:
@Target({ElementType.METHOD})@Retention(RetentionPolicy.SOURCE) public @interface Override {}&emsp;屬于標記注解,不需要設置屬性值;可以對構造方法、變量、方法、包、參數標記,告知用戶和編譯器被標記的內容已不建議被使用,如果被使用,編譯器會報警告,但不會報錯,程序也能正常運行:
@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE}) public @interface Deprecated {}&emsp;可以對構造方法、變量、方法、包、參數標記,用于告知編譯器忽略指定的警告,不用再編譯完成后出現警告信息:
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings { String[] value();}可以對接口、方法、構造方法標記,如果在應用中指定minSdkVersion為8,但有地方需要使用API 11中的方法,為了避免編譯器報錯,在調用API11中方法的接口、方法或者構造方法前面加上@Target(11),這樣該方法就可以使用<=11的API接口了。雖然這樣能夠避免編譯器報錯,但在運行時需要注意,不能在API低于11的設備中使用該方法,否則會crash(可以獲取程序運行設備的API版本來判斷是否調用該方法):
@Target({TYPE, METHOD, CONSTRUCTOR})@Retention(RetentionPolicy.CLASS)public @interface TargetApi { /** * This sets the target api level for the type.. */ int value();}和@Target的功能差不多,但使用范圍更廣,主要用于避免在lint檢查時報錯:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})@Retention(RetentionPolicy.CLASS)public @interface SuppressLint { /** * The set of warnings (identified by the lint issue id) that should be * ignored by lint. It is not an error to specify an unrecognized name. */ String[] value();}深入淺出Java注解 - 張明云的知識共享 - 知乎專欄
深入淺出Java注解 - 張明云的知識共享 - 知乎專欄
DEMO源碼傳送
相關文章: APT技術 - QQ_20198405的博客 - 博客頻道 - CSDN.NET ButterKnife - qq_20198405的博客 - 博客頻道 - CSDN.NET Dagger2 - qq_20198405的博客 - 博客頻道 - CSDN.NET
| - | - |
|---|---|
| 注解 | Annotation 示例、概念及作用、分類、自定義、解析,并對幾個 Android 開源庫 Annotation 原理進行簡析 |
| 注解 | Android依賴注入:Dagger、RoboGuice和ButterKnife - 文章 - 伯樂在線 |
| 注解 | Dagger,ButterKnife,Roboguide,AndroidAnnotations框架的依賴注入淺析 - 愛悠閑,快樂工作,悠閑生活! |
| - | - |
|---|---|
| AndroidAnnotation | Android注解AndroidAnnotation的使用及實現流程分析 - 簡書 |
新聞熱點
疑難解答