標籤:實現 原理 blog public log 編譯 get field retention
(原)
先認識註解(Annotation)
定義類用class,定義介面用interface,定義註解用@interface
如public @interface AnnotationTest{}
所有的註解類型都自動的繼承於java.lang.annotation.Annotation介面
Annotation介面文檔中這樣描述:所有註解類型都擴充於這個公用的介面,注意,一個介面,
手動的繼承了這個介面,並不意味著它是一個註解類型。換句話說,這個介面本身不是一個註解類型。
注意:這裡Annotation是個介面,不是註解,註解是不能繼承的
@Retention:保留註解
裡面有一個RetentionPolicy保留原則的枚舉屬性
這裡有三個值:
SOURCE:註解會被編譯器丟棄,不會被編譯到.class檔案中
CLASS:在編譯時間,註解會被保留在.class編譯檔案中,但是不會被虛擬機器讀取,這是一個預設值。
RUNTIME:註解會被保留在.class編譯檔案中,並且可以被虛似機在運行時擷取到,所以他們能以反射的方式讀取。
例如:平常編譯代碼時,用來壓制IDE警告的註解@SuppressWarnings和
重寫的註解@Override
被註解為SOURCE,這二個註解只會在編譯期運行,不會被編譯進.class檔案
如果註解需要用到反射,那麼必需瞭解AnnotatedElement
(以上實現是1.6版本的JDK,1.8版本已經改了,添加了幾個,這裡就不列出來了。)
注意:如果需要用到反射,一定要定義@Retention的值為RUNTIME,因為他的預設值是CLSS。
下面一個例子來認識註解怎麼用,註解寫的很清楚了,就不多說了。
這裡定義了一個註解@AnnotationTest
下面介紹另一個重要的註解
@Target
與@Retention一樣,也有一個枚舉類型的屬性
這裡值有很多,比如METHOD,這個值只能修飾方法,FIELD,這個值只能修飾屬性等
比如說我將剛才自己寫的註解加上@Target({ElementType.FIELD})
那麼剛才的這個地方就會報錯
提示我這個註解不允許放在這個地方。
JAVA註解有很多,實際開發中很少會自己去寫,都是用的第三方或是架構的,只要知道其基本原理,其實這些東西都很簡單。
10分鐘學會JAVA註解(annotation)