2.2.3 注釋的注釋
值得注意的是,J2SE5.0還提供了四種用於注釋的注釋類型。有以下的四種:
1. Target:用來指定這個注釋(Annotation)是為哪種類型而定義的。比如,這個類 型可能只是為method定義的。比如override,不能用@override來修飾class或者fIEld。
比如清單11中定義了一個注釋:TODO,而這個注釋定義了Target為 ElementType.method。因此,TODO只能用來修飾方法,不能用來修飾類或者類變量。圖5 中給出了一個非法使用TODO的例子。在MyCalculator中,定義了一個布爾型的變量 isReady,如果用TODO來修飾這個類變量的話,會出現編譯錯誤。而用TODO來修飾方法 calculateRate(),則不會出現編譯錯誤。這是因為TODO的定義已經規定了,只能用來修 飾方法。
清單11 Target的用法
@Target({ElementType.METHOD})
public @interface TODO {
int priority() default 0;
}
圖5 TODO注釋的非法使用
2.Retention:Retention的策略可以從以下三種中選取:
RetentionPolicy.SOURCE:編譯器編譯之後會會從class file中除去注釋 (Annotation)。
Retention.CLASS:注釋(Annotation)保留在class file中,但是VM不會處理。
RetentionPolicy.RUNTIME,:注釋(Annotation)保留在class file,VM會進行處理。
請注意,如果你希望在運行時查找到這些注釋在什麼地方被用到,一定要在定義注釋 的時候,選擇RetentionPolicy.RUNTIME,否則即使你用注釋修飾了類變量或者方法,在運 行時也沒有辦法獲得這個信息的。
3.Documented:這個注釋(Annotation)將作為public API的一部分。
4.Inherited : 假設注釋(Annotation)定義的時候使用了Inherited,那麼如果這個 注釋(Annotation)修飾某個class,這個類的子類也被這個注釋(Annotation)所修飾 。
2.3注釋的應用
下面各小節顯示了在哪些情況下可以使用注釋以及如何使用注釋。