Java注解詳解

Annotation基礎(chǔ)

1、什么是annotation

官網(wǎng)的解釋:
<blockquote>Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.</blockquote>
注解:一種元數(shù)據(jù)形式,提供不屬于程序本身的程序的數(shù)據(jù),Annotations對它所注解的代碼的操作沒有直接的影響。

注解的作用:
  • 為編譯器提供信息 — 編譯器可以使用注解來檢查錯誤、取消警告等
  • 編譯時和部署時處理 — 可以使用程序來處理注解從而生成代碼、xml文件等
  • 運行時處理 — 運行時動態(tài)的檢查注解信息來執(zhí)行不同的邏輯
注解的分類
  • 標準 Annotation,例如@Override,@ Deprecated, @SuppressWarnings
    標準 Annotation 是指 Java 自帶的幾個 Annotation,上面三個分別表示重寫函數(shù),不鼓勵使用(有更好方式、使用有風(fēng)險或已不在維護),忽略某項 Warning
  • 元Annotation,例如@Retention, @Target, @Inherited, @Documented
    元 Annotation 是指用來定義 Annotation 的 Annotation
  • 自定義 Annotation
    自定義 Annotation 表示自己根據(jù)需要定義的 Annotation,定義時需要用到上面的元 Annotation;根據(jù)作用域分為源碼時、編譯時、運行時 Annotation.
2、元注解

元注解的作用就是注解其他注解。Java中定義了4個標準的meta-annotation類型,用以對其他的annotation類型做說明,分別是@Target,@Retention,@Documented,@Inherited

@Target
表明Annotation所修飾的Java元素類型
取值(ElementType):

  • ElementType.ANNOTATION_TYPE: 表明注解可以被用于其他注解
  • ElementType.CONSTRUCTOR:表明注解可以用于構(gòu)造函數(shù)
  • ElementType.FIELD:表明注解可以用于類的成員變量和屬性
  • ElementType.LOCAL_VARIABLE:表明注解可以用于局部變量
  • ElementType.METHOD:表明注解可以用于方法
  • ElementType.PACKAGE:表明注解可以用于包的聲明
  • ElementType.PARAMETER:表明注解可以用于方法的參數(shù)
  • ElementType.TYPE:表明注解可以用于類、接口、枚舉等所有Class類型
    如果沒有聲明,可以修飾所有

** @Retention**
表示需要在什么級別保存該注釋信息,用于描述注解的生命周期
取值(RetentionPolicy):

  • RetentionPolicy.SOURCE: 注解的作用域限制在源碼.java文件級別,編譯器會直接忽略它.
  • RetentionPolicy.CLASS:注解的作用域限制在編譯期間.class文件級別,JVM運行時會直接忽略.
  • RetentionPolicy.RUNTIME: 作用域能夠延伸到JVM運行時
    默認為CLASS

** @ Documented** 標記注解,沒有成員
用于描述其它類型的annotation應(yīng)該被作為標注的程序成員的公共api,可以文檔化

@Inherited 標記注解
用該注解修飾的注解,會被子類繼承。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation將被用于該class的子類。

3、自定義注解

自定義注解主要包括一下兩個方面

  • 注解的元數(shù)據(jù)-包括注解的作用域、作用對象等
  • 注解的元素聲明-主要聲明注解的屬性(注解的屬性的數(shù)據(jù)類型只能為基本類型、String類型、Class類型、Annotation類型、enum類型、以上所有類型的一維數(shù)組)

接口AnnotatedElement包含了常用的Annotation相關(guān)的API,其所有已知實現(xiàn)類有:AccessibleObject, Class, Constructor, Field, Method,Package
AnnotatedElement常用方法如下:

//如果存在該元素的指定類型的注解,則返回這些注解,否則返回 null。
<T extends Annotation> T getAnnotation(Class<T> annotationClass)
//返回此元素上存在的所有注解。(如果此元素沒有注解,則返回長度為零的數(shù)組。)
Annotation[] getAnnotations()
//返回直接存在于此元素上的所有注釋,不包含繼承的注解
Annotation[] getDeclaredAnnotations()
//如果指定類型的注釋存在于此元素上,則返回 true,否則返回 false
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

自定義注解示例:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface MethodInfo {
    String author() default "trinea@gmail.com";
    String date();
    int version() default 1;
}```
這里是 MethodInfo 的實現(xiàn)部分
(1). 通過 @interface 定義,注解名即為自定義注解名
(2). 注解配置參數(shù)名為注解類的方法名,且:
* 所有方法沒有方法體,沒有參數(shù)沒有修飾符,實際只允許 public & abstract 修飾符,默認為 public,不允許拋異常
* 方法返回值只能是基本類型,String, Class, annotation, enumeration 或者是它們的一維數(shù)組
* 若只有一個默認屬性,可直接用 value() 函數(shù)。一個屬性都沒有表示該 Annotation 為 Mark Annotation

(3). 可以加 default 表示默認值

參考文章:
[官方文檔](https://docs.oracle.com/javase/tutorial/java/annotations/index.html)
[Android公共技術(shù)點之一-Java注解](http://yeungeek.com/2016/04/25/Android%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%E4%B8%80-Java%E6%B3%A8%E8%A7%A3/)
[公共技術(shù)點之 Java 注解 Annotation](http://b.codekk.com/blogs/detail/54cfab086c4761e5001b253b/)
[深入理解Java:注解(Annotation)自定義注解入門](http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html)
[Java注解與注解處理器初探](https://juejin.im/entry/595f9c4df265da6c33240804)


著名使用注解的庫:
[butterknife](https://github.com/JakeWharton/butterknife)-使用annotationProcess編譯時生成代碼
[retrofit](https://github.com/square/retrofit)-運行時注解
[dagger](https://github.com/google/dagger)-使用annotationProcess編譯時生成代碼
[hugo](https://github.com/JakeWharton/hugo)-使用aspectj編譯時生成代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,415評論 0 2
  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,756評論 15 116
  • 2.5 注解 2.5.1 注解簡介 Annotation是Java提供的一種元程序中的元素關(guān)聯(lián)任何信息和元數(shù)據(jù)(m...
    jianhuih閱讀 933評論 0 0
  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 8,821評論 4 31
  • 床前明月光,疑是地上霜。 舉頭望明月,低頭思故鄉(xiāng)。 靜靜的夜里,周圍全是一片漆黑...
    寒雪_5695閱讀 400評論 0 0

友情鏈接更多精彩內(nèi)容