1、java中的註解詳解java
一、什麼是註解架構
用一個詞就能夠描述註解,那就是元數據,即一種描述數據的數據。因此,能夠說註解就是源代碼的元數據。好比,下面這段代碼:編輯器
@Override public String toString() { return "This is String Representation of current object."; }
上面的代碼中,我重寫了toString()方法並使用了@Override註解。可是,即便我不使用@Override註解標記代碼,程序也可以正常執行。那麼,該註解表示什麼?這麼寫有什麼好處嗎?事實 上,@Override告訴編譯器這個方法是一個重寫方法(描述方法的元數據),若是父類中不存在該方法,編譯器便會報錯,提示該方法沒有重寫父類中的方法。若是我不當心拼寫錯誤,例如將toString()寫成 了 toStrring(){double r},並且我也沒有使用@Override註解,那程序依然能編譯運行。但運行結果會和我指望的大不相同。如今咱們瞭解了什麼是註解,而且使用註解有助於閱讀程序。ide
Annotation是一種應用於類、方法、參數、變量、構造器及包聲明中的特殊修飾符。它是一種由JSR-175標準選擇用來描述元數據的一種工具。工具
二、爲何要使用註解測試
使用Annotation以前(甚至在使用以後),XML被普遍的應用於描述元數據。不知什麼時候開始一些應用開發人員和架構師發現XML的維護愈來愈糟糕了。他們但願使用一些和代碼緊耦合的東西,而不是像 XML那樣和代碼是鬆耦合的(在某些狀況下甚至是徹底分離的)代碼描述。this
假如你想爲應用設置不少的常量或參數,這種狀況下,XML是一個很好的選擇,由於它不會同特定的代碼相連。若是你想把某個方法聲明爲服務,那麼使用Annotation會更好一些,由於這種狀況下需 要註解和方法緊密耦合起來,開發人員也必須認識到這點。spa
另外一個很重要的因素是Annotation定義了一種標準的描述元數據的方式。在這以前,開發人員一般使用他們本身的方式定義元數據。例如,使用標記interfaces,註釋,transient關鍵字等等。每一個程序 員按照本身的方式定義元數據,而不像Annotation這種標準的方式。code
三、註解的基本語法blog
jdk1.5版本內置了三種標準的註解:
J2SE5.0版本在 java.lang.annotation提供了四種元註解,專門註解其餘的註解:
(1)、@Target:
表示該註解能夠用於什麼地方,可能的ElementType參數有: CONSTRUCTOR
:構造器的聲明 FIELD
:域聲明(包括enum
實例) LOCAL_VARIABLE
:局部變量聲明 METHOD
:方法聲明 PACKAGE
:包聲明 PARAMETER
:參數聲明 TYPE
:類、接口(包括註解類型)或enum
聲明
(2)、@Retention:
表示須要在什麼級別保存該註解信息。可選的RetentionPolicy參數包括: SOURCE
:註解將被編譯器丟棄 CLASS
:註解在class文件中可用,但會被VM丟棄 RUNTIME
:VM將在運行期間保留註解,所以能夠經過反射機制讀取註解的信息
(3)、@Document: 將註解包含在Javadoc中
(4)、@Inherited: 容許子類繼承父類中的註解
2、自定義註解
一、利用元註解定義本身的註解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ReqValue { String values() default ""; }
這裏,咱們定義了一個註解,其中有一個屬性,從元註解可看出此註解做用於屬性。
二、定義一個類,並利用此註解
public class User { @ReqValue(values = "張三") private String userName; @ReqValue(values = "123") private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
在這裏,咱們在User的屬性上利用自定義的註解爲其賦值。而這個值怎麼獲取到呢,下面第三步
三、咱們寫一個測試方法
@Test public void reqValueTest() { Class<User> userClass = User.class; //得到User類的全部屬性信息 Field[] fields = userClass.getDeclaredFields(); //得到類中全部屬性的註解信息 for (Field field : fields) { if (field.isAnnotationPresent(ReqValue.class)) { // 若是屬性中包含ReqValue註解 ReqValue reqValue = field.getAnnotation(ReqValue.class);// 獲取屬性中的ReqValue註解 System.out.println(field.getName() + "值爲:" + reqValue.values());// 取值 } } }
結合反射,即可以輕易的獲得註解的內容,從而讓註解生效。
運行結果:
userName值爲:張三
password值爲:123
固然這裏,咱們只是演示一下註解怎麼用,並無發揮出註解的強大功能。小夥伴們能夠根據本身的實際狀況靈活的使用註解。
以上就是關於java中註解的簡單介紹,但願能給讀到的每一個人提供幫助,若有有紕漏,歡迎指正。