JAVA自學筆記,Annotation註解

JDK1.5中開始增加了Annotation,它表示註解,它與之前學過的註釋是不同的。Annotation是java.lang包下的一個接口,它是代碼裏的特殊標記,這些標記可以在編譯,類加載,運行時被讀取,並執行相應的處理,它可用於類,構造方法,成員變量,方法,參數等的聲明中,使用Annotation並不影響程序的運行,但是會對編譯器警告等輔助工具產生影響。註解主要分爲內置註解和自定義註解兩種。

內置註解

Java中的內置註解位於java.lang包下,它包含3個基本的註解,分別如下:
1,@Override:限定重寫父類方法。
2,@Deprecated:表示已過時
3,@SuooressWarnings:移植編譯器警告。
例如我們在代碼中重寫接口或抽象類中的方法時,就需要用到@Override註解。
在這裏插入圖片描述

自定義註解

使用自定義註解主要分爲一下3個步驟:
1,自定義註解;
2,使用元註解對自定義註解進行設置。
3,反射註解。

自定義註解

在定義Annotation類型時,需要用到用來定義接口的interface關鍵字,但需要在interface關鍵字前加一個“@”符號,即定義Annotation類型的關鍵字爲@interface,這個關鍵字的隱含意思是繼承了java.lang.annotation.Annotation接口。例如:

public @interface NoMeberAnnotation{

}

上面定義的Annotation類型@NoMemberAnnotation未包含任何成員,這樣的Annotation類型被稱爲marker annotation。下面定義一個只包含一個成員的Annotation類型

public @interface NoMeberAnnotation{
	String value();
}

String:成員類型。可用的成員類型有String,Class,primitive,enumerated和annotation,以及所列類型的數組。
value:成員名稱,如果在所定義的Annotation類型中只包含一個成員,通常將成員名稱命名爲value。
下面的代碼定義了一個包含多個成員的Annotation類型:

public @interface MoreMeberAnnotation{
	String describe():
	Class type():
}

在爲Annotation類型定義成員時,也可以爲成員設置默認值。例如,下面的代碼在定義Annotation類型時就爲成員設置了默認值:

public @interface DefaultMeberAnnotation{
	Strign describe() default"<默認值>";
	Class type() default void.class;//void關鍵字的class類型,用於佔位,被任何class類型值覆蓋
}

使用元註解對自定義註解進行設置

在自定義註解時,可以使用元註解對自定義的註解進行設置。這裏提到了元註解,那麼元註解是什麼呢?Java中的元註解位於java.lang.annotation包下,他們的主要作用是負責註解其他註解。Java中一共有4個元註解:
1,@Decumented:指示某一類型的註釋通過javadoc和類似的默認工具進行文檔化
2,@Inherited:指示註解類型被自動繼承。
3,@Retention:指示主食類型的註釋要保留多久。
4,@Target:指示註解類型所適用的程序元素的種類。
上面4個元註解中,經常用到的是@Target註解和@Retention註解,下面分別介紹:

@Target註解

在自定義Annotation類型時,可以通過元註解@Target來設置Annotation類型使用的程序元素種類,如果未設置@Target,則表示適用於所有程序元素。枚舉類型ElementType中的枚舉常用來設置@Target:
在這裏插入圖片描述

@Retention註解

通過元註解@Retention可以設置自定義Annotation的有效範圍,枚舉類RetentionPolicy中的枚舉常量用來設置@Retention。
在這裏插入圖片描述
如果未設置@Retention,Annotation的有效範圍爲枚舉常量CLASS表示的範圍。

反射註解

上面說到在自定義註解時,可以使用@Retention設置註解的有效範圍,如果將該註解的值設置爲RetentionPolicy.RUNTIME,那麼在運行程序時通過反射就可以獲取到相關的Annotataion信息,如獲取構造方法,成員變量和方法的Annotation信息。
前面介紹過Constructor類Field類和Method類分別用來儲存類的構造方法,成員變量和方法信息,它們均繼承自AccessibleObject類,而在AccessibleObject類中定義了3個關於Annotation的方法,分別如下:
1,isAnnotationPresent(Class<? extends Annotation> annotationClass)方法:查看是否添加了指定類型的Annotation,如果是則返回true,否則返回false。
2,getAnnotation(ClassannotationClass)方法:獲得指定類型的Annotation,如果存在則返回相應的對象,否則返回null。
3,getAnnotations()方法:獲得所有的Annotation,該方法將返回一個Annotation數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章