Java @註解

來源:互聯網
上載者:User

標籤:

1.註解簡介

     在開發Java程式,尤其是Java EE應用的時候,總是免不了與各種設定檔打交道。以Java EE中典 型的S(pring)S(truts)H(ibernate)架構來說,Spring、Struts和Hibernate這三個架構都有自己的XML格式的設定檔。這些設定檔需要與Java原始碼儲存同步,否則的話就可能出現錯誤。而且這些錯誤有可能到了運行時刻才被發現。把同一份資訊儲存在兩個地方,總是個壞的主意。理想的情況是在一個地方維護這些資訊就好了。其它部分所需的資訊則通過自動的方式來產生。JDK5中引入了原始碼中的註解(annotation)這一機制。註解使得Java原始碼中不但可以包含功能性的實現代碼,還可以添加中繼資料。註解的功能類似於代碼中的注釋,所不同的是註解不是提供代碼功能的說明,而是實現程式功能的重要組成部分。Java註解已經在很多架構中得到了廣泛的使用,用來簡化程式中的配置。

a.產生文檔。這是最常見的,也是java 最早提供的註解。常用的有@see @param @return 等;
b.跟蹤代碼依賴性,實現替代設定檔功能。比較常見的是spring 2.5 開始的基於註解配置。作用就是減少配置。現在的架構基本都使用了這種配置來減少設定檔的數量;
c. 編譯時間進行格式檢查。如@Override 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時間就能檢查出。

2.使用註解

     註解的文法比較簡單,除了@符號的使用之外,它基本與Java固有文法一致。Java SE5內建了三種標準註解:  @Override,表示當前的方法定義將覆蓋超類中的方法。  @Deprecated,使用了註解為它的元素編譯器將發出警告,因為註解@Deprecated是不贊成使用的代碼,被棄用的代碼。 @SuppressWarnings,關閉不當編譯器警告資訊。 上面這三個註解多少我們都會在寫代碼的時候遇到。Java還提供了4中註解,專門負責新註解的建立。

@Target

表示該註解可以用於什麼地方,可能的ElementType參數有:

CONSTRUCTOR:構造器的聲明

FIELD:域聲明(包括enum執行個體)

LOCAL_VARIABLE:局部變數聲明

METHOD:方法聲明

PACKAGE:包聲明

PARAMETER:參數聲明

TYPE:類、介面(包括註解類型)或enum聲明

@Retention

表示需要在什麼層級儲存該註解資訊。可選的RetentionPolicy參數包括:

SOURCE:註解將被編譯器丟棄

CLASS:註解在class檔案中可用,但會被VM丟棄

RUNTIME:VM將在運行期間保留註解,因此可以通過反射機制讀取註解的資訊。

@Document

將註解包含在Javadoc中

@Inherited

允許子類繼承父類中的註解

     在一般的Java開發中,最常接觸到的可能就是@Override和@SupressWarnings這兩個註解了。使用@Override的時候只需要一個簡單的聲明即可。這種稱為標記註解(markerannotation ),它的出現就代表了某種配置語義。而其它的註解是可以有自己的配置參數的。配置參數以名值對的方式出現。使用 @SupressWarnings的時候需要類似@SupressWarnings({"uncheck", "unused"})這樣的文法。在括弧裡面的是該註解可供配置的值。由於這個註解只有一個配置參數,該參數的名稱預設為value,並且可以省略。而花括弧則表示是數群組類型。在JPA中的@Table註解使用類似@Table(name = "Customer", schema = "APP")這樣的文法。從這裡可以看到名值對的用法。在使用註解時候的配置參數的值必須是編譯時間刻的常量。 從某種角度來說,可以把註解看成是一個XML元素,該元素可以有不同的預定義的屬性。而屬性的值是可以在聲明該元素的時候自行指定的。在代碼中使用註解,就相當於把一部分中繼資料從XML檔案移到了代碼本身之中,在一個地方管理和維護。

3.開發註解

      在一般的開發中,只需要通過閱讀相關的API文檔來瞭解每個註解的配置參數的含義,並在代碼中正確使用即可。在有些情況下,可能會需要開發自己的註解。這在庫的開發中比較常見。註解的定義有點類似介面。下面的代碼給出了一個簡單的描述代碼分工安排的註解。通過該註解可以在原始碼中記錄每個類或介面的分工和進度情況。

1 @Retention(RetentionPolicy.RUNTIME)2 @Target(ElementType.TYPE)3 public @interface Assignment {4 String assignee();5 int effort();6 double finished() default 0;7 } 

      @interface用來聲明一個註解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,傳回值類型就是參數的類型。可以通過default來聲明參數的預設值。在這裡可以看到@Retention和@Target這樣的元註解,用來聲明註解本身的行為。@Retention用來聲明註解的保留原則,有CLASS、RUNTIME和SOURCE這三種,分別表示註解儲存在類檔案、JVM運行時刻和原始碼中。只有當聲明為RUNTIME的時候,才能夠在運行時刻通過反射API來擷取到註解的資訊。@Target用來聲明註解可以被添加在哪些類型的元素上,如類型、方法和域等。

Java @註解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.