註解,就是在類的某一個部分打上一個標記,那麼註釋類型的註釋要保留多久呢?如果註釋類型聲明中不存在 Retention 註釋,則保留策略默認爲 RetentionPolicy.CLASS只有元註釋類型直接用於註釋時,Target 元註釋纔有效。如果元註釋類型用作另一種註釋類型的成員,則無效。註解保留時間:
RetentionPolicy.CLASS:編譯器將把註釋記錄在類文件中,但在運行時 VM 不需要保留註釋。
RetentionPolicy.RUNTIME:編譯器將把註釋記錄在類文件中,在運行時 VM 將保留註釋,因此可以反射性地讀取。
RetentionPolicy.SOURCE:編譯器要丟棄的註釋。
下面定義一個註解,舉一個例:
@Retention(value=RUNTIME)
public @interface Test{
String value();
}
上面介紹了註解保存多久,如何定義,那註解可以使用在哪些地方呢?註解放在哪個地方用@Target元註解定義。
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
public @interface Bogus {
...
}
這樣定義一個註解到底放在哪個地方,如果想讓註解放在多個地方,在()加一個{}在大括號裏面一一寫出可放的位置,用逗號隔開。
可放的位置:
ElementType.ANNOTATION_TYPE:註釋類型聲明
ElementType.CONSTRUCTOR :構造方法聲明
ElementType.FIELD :字段聲明(包括枚舉常量)
ElementType.LOCAL_VARIABLE :局部變量聲明
ElementType.METHOD :方法聲明
ElementType.PACKAGE :包聲明
ElementType.PARAMETER: 參數聲明
ElementType.TYPE :類、接口(包括註釋類型)或枚舉聲明
註解放在這些地方什麼時候起作用呢?其實註解並沒有什麼作用,它只是起到一個標記的作用。只有註解處理類來處理它,這裏就需要使用一些反射技術了,在一個類中,我們得到了其它的類的對象,我們就可以能過反射來得到它身上是否有這個標記。然後再針對這個標記的值進行處理。
註解的屬性:
註解的屬性的定義,跟在接口裏面定義方法基本上相同,唯一不同的是註解裏面的屬性可以定義缺省值。一個屬性定義後,如果我們想給它一個缺省值,就可以直接在後面寫上缺省值,這樣,在用這個註解的時候就可以不用給這個屬性賦值,它就會使用缺省值。有一個特殊的屬性,叫value這個可以定義後,使用的時候可以直接寫值,直接寫值,就相於是賦值給這個屬性的。