1.關於元註解@Retention()
在註解上又加的註解就是元註解。@Retention()括號中的取值RetentionPolicy是一個枚舉,有三個取值:RetentionPolicy.SURECE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME,分別對應java源文件,class文件,內存中字節碼文件。其默認值是class階段的RetentionPolicy.CLASS。
自定義一個註解,如果沒有 加原註解,它默認爲@Retention(RetentionPolicy.CLASS),如下示例:
註解類:ItCastAnnotation.java
public @interface ItCastAnnotation {
}
調用註解類的類:AnnotationTest.java
@ItCastAnnotation
public class AnnotationTest {
public static void main(String[] args) {
if(AnnotationTest.class.isAnnotationPresent(ItCastAnnotation.class))
{
ItCastAnnotation annotation=(ItCastAnnotation)AnnotationTest.class.getAnnotation(ItCastAnnotation);
System.out.println(annotation);
}
}
}
結果運行沒有輸出,因爲註解類AnnotationTest.java的默認存在階段是RetentionPolicy.CLASS階段,調用了它的函數會運行到內存字節碼階段,到內存字節碼階段執行 System.out.println(annotation);時annotation已經不存在,所以錯。
JDK中定義的三個註解類型:Deprecated ,Override,SuppressWarnings其@Retention(value=“”)分別爲:RUNTIME,SOURCE,SOURCE。如圖:
因爲Override,SuppressWarnings只是給編譯器用,所以在源代碼階段存在就行。而Deprecated雖然也是給編譯器看,但它要用的內存中的字節碼,所以要一直運行到RUNTIME階段。