一、什么是Java注解:
Java注解(Annotation),是Java代碼里的特殊標記,它為我們在代碼中添加用Java程序無法表達的額外信息提供了一種形式化的方法,使我們在未來可以方便的使用這些被注解修飾的程序元素(類、方法、變量)。
二、Java注解的作用:
1、將由編譯器來測試和驗證的格式,存儲有關程序的額外信息。比如@Override,可以讓編譯器檢查子類中是否有重寫父類中的方法。
2、生成描述性文件,甚至新的類定義。
3、減輕編寫模板代碼的負擔。
4、使代碼更加干凈易懂。
三、Java注解的分類:
1、Java SE5內置了三種內建注解
@Override,表示當前的方法定義將覆蓋超類中的方法。
@Deprecated,使用了注解為它的元素編譯器將發出警告,因為注解@Deprecated是不贊成使用的代碼,被棄用的代碼。
@SuppressWarnings,關閉不當編譯器警告信息。
2、Java還提供了4種元注解
用來修飾其他注解定義,這4個注解分別是@Taget、@Retention、@Decoumented、@Inherited。下面表格中說明4種注解的說明。
@Target |
表示該注解可以用於什么地方,可能的ElementType參數有: CONSTRUCTOR:構造器的聲明 FIELD:域聲明(包括enum實例) LOCAL_VARIABLE:局部變量聲明 METHOD:方法聲明 PACKAGE:包聲明 PARAMETER:參數聲明 TYPE:類、接口(包括注解類型)或enum聲明 |
@Retention |
表示需要在什么級別保存該注解信息。可選的RetentionPolicy參數包括: SOURCE:注解將被編譯器丟棄 CLASS:注解在class文件中可用,但會被VM丟棄 RUNTIME:VM將在運行期間保留注解,因此可以通過反射機制讀取注解的信息。 |
@Document |
將注解包含在Javadoc中 |
@Inherited |
允許子類繼承父類中的注解
|
3、自定義注解
通過元注解,用戶自己編寫注解。例如下面代碼就是用戶定義的自定義注解。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Test { }
除了@符號,注解很像是一個接口。定義注解的時候需要用到元注解,上面用到了@Target和@RetentionPolicy,它們的含義在上面的表格中已近給出。
在注解中一般會有一些元素以表示某些值。注解的元素看起來就像接口的方法,唯一的區別在於可以為其制定默認值。沒有元素的注解稱為標記注解,上面的@Test就是一個標記注解。
注解的可用的類型包括以下幾種:所有基本類型、String、Class、enum、Annotation、以上類型的數組形式。元素不能有不確定的值,即要么有默認值,要么在使用注解的時候提供元素的值。而且元素不能使用null作為默認值。注解在只有一個元素且該元素的名稱是value的情況下,在使用注解的時候可以省略“value=”,直接寫需要的值即可。
下面看一個定義了元素的注解。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UseCase { public String id(); public String description() default "no description"; }
定義了注解,必然要去使用注解。
public class PasswordUtils { @UseCase(id = 47, description = "Passwords must contain at least one numeric") public boolean validatePassword(String password) { return (password.matches("\\w*\\d\\w*")); } @UseCase(id = 48) public String encryptPassword(String password) { return new StringBuilder(password).reverse().toString(); } }
使用注解最主要的部分在於對注解的處理,那么就會涉及到注解處理器。
從原理上講,注解處理器就是通過反射機制獲取被檢查方法上的注解信息,然后根據注解元素的值進行特定的處理。
Found Use Case:47 Passwords must contain at least one numeric Found Use Case:48 no description Warning: Missing use case-49 Warning: Missing use case-50
上面的三段代碼結合起來是一個跟蹤項目中用例的簡單例子
四、注解和注釋的區別:
注解與普通的注釋有一定的區別,也有一定的聯系。注解和注釋都屬於對代碼的描述,注釋的作用只是簡單的描述程序的信息,它不會被程序所讀取;而注解則是Java代碼中的特殊標記,這些標記可以在編譯、加載、運行時被讀取,並執行相應的處理。