Java註解(1)-註解基礎

來源:互聯網
上載者:User

標籤:重複   自訂   element   oca   括弧   .so   ack   info   可重複   

註解(Annotation)是在JAVA5中開始引入的,它為在代碼中添加資訊提供了一種新的方式。註解在一定程度上把中繼資料與原始碼檔案結合在一起,正如許多成熟的架構(Spring)所做的那樣。那麼,註解到底可以做什麼呢?

1、註解的作用。
  • 提供用來完整地描述程式所需要的資訊,如編譯期校正程式資訊。
  • 產生描述符檔案,或產生新類的定義。
  • 減輕編寫“樣板”代碼(設定檔)的負擔,可以使用註解自動產生。
  • 更加乾淨易讀的代碼。
  • 編譯期類型檢查。
2、Java提供的註解

Java5內建了一些原生的註解,它們僅次於java.lang包下(不止於此):

  • @Override,表示當前的方法定義將覆蓋超類中的方法。
  • @Deprecated,標識元素為棄用的,如果程式員使用了註解為它的元素,編譯器會發出警告資訊。
  • @SuppressWarnings,關閉不當的編譯器警告資訊。

以上註解均為源碼層級註解(即為RetentionPolicy.SOURCE標註,需要注意的是,雖然@Deprecated是由RetentionPolicy.CLASS標註,但是所起的作用主要還是在編譯期),僅編譯器可讀取,編譯成class將會捨棄,當然,運行時就更不會存在了。

Java還提供了一些元註解,用於自訂註解(meta-annotations),如@Target、@Retention、@SupportedSourceVersion等。java.lang.annotation包中的元註解:

@Retention 指定標識的註解如何儲存。

  • RetentionPolicy.SOURCE – 註解將僅儲存在原始碼層級,將會被編譯器丟棄。
  • RetentionPolicy.CLASS – 將會在編譯時間期使用,並儲存在class中,但JVM不會識別此。
  • RetentionPolicy.RUNTIME – 此註解將會被JVM識別,理論上將會在任意時期都會存在。

@Documented 表明該註解標識的元素所使用的註解應該出現在javadoc中。

@Target 指定哪種JAVA元素可以使用當前定義的註解,指定類型(ElementType)如下:

  • ElementType.ANNOTATION_TYPE 注釋型別宣告。
  • ElementType.CONSTRUCTOR 構造方法聲明。
  • ElementType.FIELD 欄位聲明(包括枚舉常量)。
  • ElementType.LOCAL_VARIABLE 局部變數聲明。
  • ElementType.METHOD 方法聲明。
  • ElementType.PACKAGE 包聲明。
  • ElementType.PARAMETER 參數聲明。
  • ElementType.TYPE 類、介面(包括注釋類型)或枚舉聲明。

@Inherited  指示注釋類型被自動繼承。如果在注釋型別宣告中存在 Inherited 元注釋,並且使用者在某一類聲明中查詢該注釋類型,同時該類聲明中沒有此類型的注釋,則將在該類的超類中自動查詢該注釋類型。此過程會重複進行,直到找到此類型的注釋或到達了該類階層的頂層 (Object) 為止。如果沒有超類具有該類型的注釋,則查詢將指示當前類沒有這樣的注釋。

注意,如果使用注釋類型注釋類以外的任何事物,此元注釋類型都是無效的。還要注意,此元注釋僅促成從超類繼承注釋;對已實現介面的注釋無效。

@Repeatable (Java8中增加)使用此註解注釋的註解,在使用時是可重複使用的。注意,在Java8之前註解同一個註解在同一個元素上是不可以多次使用的。

3、定義註解

大多數時候,開發人員需要自己定義註解以滿足不同的需求。

定義註解,註解一般包括註解的定義、註解元素、元註解,樣本如下:

package com.zenfery.example.annotation; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Target(ElementType.TYPE)@Retention(RetentionPolicy.CLASS)public @interface ClassInfo { String value() default "default";}
3.1、註解的定義

使用關鍵字@interface來定義,如上public @interface ClassInfo,註解的許可權限定符僅支援public、default(包存取權限)。

3.2、元註解

如上@Target(ElementType.TYPE),表示註解ClassInfo可用於類、介面、或者枚舉類型。

3.3、註解元素

註解元素使用類似普通方法的定義格式,如上述例子中的value(),使用default指定預設值。註解元素在使用時必須有值,要麼是預設值,要麼在使用註解是提供元素的值。且註解元素的值不能為null值。

註解元素的可用類型有:所有的基本類型、String、Class、enum、Annotation、以上類型的數組。如果使用複雜類型的註解,可使用註解的嵌套來實現。如果程式員的註解中定義了名為value的元素,並且在應用該註解的時候,如果該元素是唯一需要賦值的一個元素,那麼此時無需使用名-值對的文法,而只需在括弧內給出value元素所需的值即可。

3.4、註解不支援繼承

不可使用extends關鍵字繼承某個@interface。可以使用嵌套來實現相似的功能。

4、註解的使用

如果要使用以上的註解,可像如下這種方式使用:

package com.zenfery.example.annotation.clazz; import com.zenfery.example.annotation.ClassInfo; @ClassInfo("這是HelloAnnotation類。")public class HelloAnnotation {}

轉載請註明:子暃之路 ? Java註解(1)-註解基礎

Java註解(1)-註解基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.