注解(annotation)不是注釋(comment);
注解,是一種中繼資料(metadata),可為我們在代碼中添加資訊提供了一種形式化的方法。注解在一定程度上實作了中繼資料和源代碼檔案的結合,而不是将中繼資料儲存在外部文檔中。
Java SE5 在 java.lang 中定義的三種基本注釋:
@Override
@Deprecated
@SuppressWarnings
以及 4 中元注解:
@Target
@Retention
RetentionPolicy.SOURCE – 在編譯階段丢棄。這些注解在編譯結束之後就不再有任何意義,是以它們不會寫入位元組碼。@Override, @SuppressWarnings都屬于這類注解。
RetentionPolicy.CLASS – 在類加載的時候丢棄。在位元組碼檔案的進行中有用。注解預設使用這種方式。
RetentionPolicy.RUNTIME– 始終不會丢棄,運作期也保留該注解,是以可以使用反射機制讀取該注解的資訊。我們自定義的注解通常使用這種方式。
@Documented(将此注解包含在 doc 中)
@Inherited(允許子類繼承父類中的注解)
可以看到,注解的定義看起來很像接口(@interface)的定義。事實上,與其他任何 java 接口一樣,注解也會被編譯成 .class 檔案:
定義注解時,會需要一些元注解(meta-annotation),比如上例的 @Target 和 @Retention。
@Target 用來定義你的注解将應用在什麼地方
一個方法(@Target(ElementType.METHOD)),
或是一個域(成員變量,@Target(ELEMENTTYPE.FIELD))
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.PACKAGE
ElementType.TYPE
ElementType.PARAMETER
@Retention 用來定義該注解在哪一級别可用:
SOURCE:源代碼中;
CLASS:類檔案中;
RUNTIME:運作時;
在注解上,一般也會包含一些元素以表示某些值。當搜集分析處理注解時,程式或者工具可以利用這些值(沒有元素的注解稱為标記注解 marker annotation,也即僅起到标記作用,如上例的 @Test)。注解的元素看起來就像接口的方法,唯一的差別你可以為其指定預設值。
如下為一個用來跟蹤項目用例的注解。如果一個方法或一組方法實作了某個用例的需求,那麼程式員可以為此方法加上注解。項目經理便可通過計算已經實作的用例,以掌握項目的進展。