首先看名字,註解——跟註釋長得挺像。註解跟註釋很相似,類比思考一下,註釋是幹什麼用的?html
/**java
* 註釋是一種存在於源代碼中的信息,用於開發過程當中給程序員提示和幫助。程序員
**/web
註解也是相似的東西,他也帶來信息,不過跟註釋不同的地方在於,註解能夠保留到編譯以後的二進制代碼中,而註釋則在編譯階段就被拋棄了。spring
因爲註解擁有能夠保留到二進制代碼中的特徵,所以能夠經過註解爲框架帶來元信息。api
舉個例子:最經常使用的註解之一@Controller 將這個註解標註到Controller類上,在springMVC(一種java mvc框架)構建ApplicationContext環境的時候,就會發現,哦這是一個控制器,這個控制器要映射到url上。這就至關於在類上面添加了一個能保留到二進制代碼中的//這是一個控制器類 這麼一段註釋。數組
定義註解時,須要一些元註解(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 | 容許子類繼承父類的註解 |
默認值限制
編譯器對元素的默認值有些過度挑剔。首先,元素不能有不肯定的值。也就是說,元素必需要麼具備默認值,要麼在使用註解時提供元素的值。
其次,對於非基本類型的元素,不管是在源代碼中聲明,仍是在註解接口中定義默認值,都不能以null做爲值。這就是限制,這就形成處理器很難表現一個元素的存在或缺失狀態,由於每一個註解的聲明中,全部的元素都存在,而且都具備相應的值。爲了繞開這個限制,只能定義一些特殊的值,例如空字符串或負數,表示某個元素不存在。
@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface MockNull {
public int id() default -1;
public String description() default "";
}
3、註解的使用
說過了註解是什麼東西,註解怎麼定義,該說說註解如何使用了。
首先聲明一點,註解都是給框架用的,說到框架使用,很容易聯想到反射。
<A extends Annotation>
AgetAnnotation(Class<A> annotationClass)
若是存在該元素的指定類型的註釋,則返回這些註釋,不然返回 null。Annotation[]
getAnnotations()
返回此元素上存在的全部註釋。Filed類等能夠擁有註解的反射類型都有相似能夠獲取註解的方法
<T extends Annotation>
TgetAnnotation(Class<T> annotationClass)
若是存在該元素的指定類型的註釋,則返回這些註釋,不然返回 null。
4、總結
註解在java中屬於一種比較高級並且麻煩的技術,非框架編寫者基本不會用到這種技術。可是瞭解註解是個什麼東西很重要,由於註解在框架的快捷配置中起了決定性的做用,也讓no xml黨們擁有了一個脫離xml配置的機會。瞭解註解可讓咱們不止知其然還知其因此然,在使用框架的時候不至於迷迷糊糊的就@了個圈在上面。