天天看點

Java 基礎 —— 注解

注解(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)。注解的元素看起來就像接口的方法,唯一的差別你可以為其指定預設值。

如下為一個用來跟蹤項目用例的注解。如果一個方法或一組方法實作了某個用例的需求,那麼程式員可以為此方法加上注解。項目經理便可通過計算已經實作的用例,以掌握項目的進展。