Java註解——這些@圈圈都是個啥?

1、啥是@ 註解

  首先看名字,註解——跟註釋長得挺像。註解跟註釋很相似,類比思考一下,註釋是幹什麼用的?html

  /**java

  * 註釋是一種存在於源代碼中的信息,用於開發過程當中給程序員提示和幫助。程序員

  **/web

  註解也是相似的東西,他也帶來信息,不過跟註釋不同的地方在於,註解能夠保留到編譯以後的二進制代碼中,而註釋則在編譯階段就被拋棄了。spring

  因爲註解擁有能夠保留到二進制代碼中的特徵,所以能夠經過註解爲框架帶來元信息。api

  舉個例子:最經常使用的註解之一@Controller 將這個註解標註到Controller類上,在springMVC(一種java mvc框架)構建ApplicationContext環境的時候,就會發現,哦這是一個控制器,這個控制器要映射到url上。這就至關於在類上面添加了一個能保留到二進制代碼中的//這是一個控制器類 這麼一段註釋。數組

 

2、註解的語法

定義註解時,須要一些元註解(meta-annotation),如@Target和@Retentionmvc

 

  • @Target用來定義註解將應用於什麼地方(如一個方法或者一個域)框架

  • @Retention用來定義註解在哪個級別可用,在源代碼中(source),類文件中(class)或者運行時(runtime)url

  • 在註解中,通常都會包含一些元素以表示某些值。當分析處理註解時,程序能夠利用這些值。沒有元素的註解稱爲標記註解(marker annotation)

  • 四種元註解,元註解專職負責註解其餘的註解,因此這四種註解的Target值都是ElementType.ANNOTATION_TYPE

 

註解 說明
@Target 表示該註解能夠用在什麼地方,由ElementType枚舉定義 
CONSTRUCTOR:構造器的聲明 
FIELD:域聲明(包括enum實例) 
LOCAL_VARIABLE:局部變量聲明 
METHOD:方法聲明 
PACKAGE:包聲明
PARAMETER:參數聲明
TYPE:類、接口(包括註解類型)或enum聲明 
ANNOTATION_TYPE:註解聲明(應用於另外一個註解上)
TYPE_PARAMETER:類型參數聲明(1.8新加入) 
TYPE_USE:類型使用聲明(1.8新加入)
PS:當註解未指定Target值時,此註解可使用任何元素之上,就是上面的類型
@Retention 表示須要在什麼級別保存該註解信息,由RetentionPolicy枚舉定義 
SOURCE:註解將被編譯器丟棄(該類型的註解信息只會保留在源碼裏,源碼通過編譯後,註解信息會被丟棄,不會保留在編譯好的class文件裏)
CLASS:註解在class文件中可用,但會被VM丟棄(該類型的註解信息會保留在源碼裏和class文件裏,在執行的時候,不會加載到虛擬機(JVM)中)
RUNTIME:VM將在運行期也保留註解信息,所以能夠經過反射機制讀取註解的信息(源碼、class文件和執行的時候都有註解的信息)
PS:當註解未定義Retention值時,默認值是CLASS
@Documented 表示註解會被包含在javaapi文檔中
@Inherited 容許子類繼承父類的註解

 

註解元素

 

  • 註解元素可用的類型以下:

    • 全部基本類型(int,float,boolean,byte,double,char,long,short)

    • String

    • Class

    • enum

    • Annotation

    • 以上類型的數組 若是使用了其餘類型,那編譯器就會報錯。也不容許使用任何包裝類型。註解也能夠做爲元素的類型,也就是註解能夠嵌套。 元素的修飾符,只能用public或default。

 

  • 默認值限制

    編譯器對元素的默認值有些過度挑剔。首先,元素不能有不肯定的值。也就是說,元素必需要麼具備默認值,要麼在使用註解時提供元素的值。

 

    其次,對於非基本類型的元素,不管是在源代碼中聲明,仍是在註解接口中定義默認值,都不能以null做爲值。這就是限制,這就形成處理器很難表現一個元素的存在或缺失狀態,由於每一個註解的聲明中,全部的元素都存在,而且都具備相應的值。爲了繞開這個限制,只能定義一些特殊的值,例如空字符串或負數,表示某個元素不存在。

 

@Target(ElementType.Method)

@Retention(RetentionPolicy.RUNTIME)

public @interface MockNull {

 

    public int id() default -1;

 

    public String description() default "";

 

}

 

3、註解的使用

說過了註解是什麼東西,註解怎麼定義,該說說註解如何使用了。

首先聲明一點,註解都是給框架用的,說到框架使用,很容易聯想到反射。

 

<A extends Annotation
A
getAnnotation(Class<A> annotationClass) 
          若是存在該元素的指定類型的註釋,則返回這些註釋,不然返回 null。
 Annotation[] getAnnotations() 
          返回此元素上存在的全部註釋。

 Filed類等能夠擁有註解的反射類型都有相似能夠獲取註解的方法

<T extends Annotation
T
getAnnotation(Class<T> annotationClass) 
          若是存在該元素的指定類型的註釋,則返回這些註釋,不然返回 null。

 

4、總結

註解在java中屬於一種比較高級並且麻煩的技術,非框架編寫者基本不會用到這種技術。可是瞭解註解是個什麼東西很重要,由於註解在框架的快捷配置中起了決定性的做用,也讓no xml黨們擁有了一個脫離xml配置的機會。瞭解註解可讓咱們不止知其然還知其因此然,在使用框架的時候不至於迷迷糊糊的就@了個圈在上面。

相關文章
相關標籤/搜索