10分鐘學會JAVA註解(annotation)

來源:互聯網
上載者:User

標籤:實現   原理   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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.