Java自訂註解Annotation詳解

來源:互聯網
上載者:User

標籤:

註解相當於一種標記,在程式中加了註解就等於為程式打上了某種標記,沒加,則等於沒有某種標記,以後,javac編譯器,開發工具和其他程式可以用反射來瞭解你的類及各種元素上有無何種標記,看你有什麼標記,就去幹相應的事。標記可以加在包,類,欄位,方法,方法的參數以及局部變數上。

自訂註解及其應用1)、定義一個最簡單的註解
public @interface MyAnnotation {    //......}
2)、把註解加在某個類上:
@MyAnnotationpublic class AnnotationTest{    //......}

Java中提供了四種元註解,專門負責註解其他的註解,分別如下:

@Retention元註解,表示需要在什麼層級儲存該注釋資訊(生命週期)。可選的RetentionPoicy參數包括:

RetentionPolicy.SOURCE: 停留在java源檔案,編譯器被丟掉

RetentionPolicy.CLASS:停留在class檔案中,但會被VM丟棄(預設)

RetentionPolicy.RUNTIME:記憶體中的位元組碼,VM將在運行時也保留註解,因此可以通過反射機制讀取註解的資訊

@Target元註解,預設值為任何元素,表示該註解用於什麼地方。可用的ElementType參數包括

ElementType.CONSTRUCTOR: 構造器聲明

ElementType.FIELD: 成員變數、對象、屬性(包括enum執行個體)

ElementType.LOCAL_VARIABLE: 局部變數聲明

ElementType.METHOD: 方法聲明

ElementType.PACKAGE: 包聲明

ElementType.PARAMETER: 參數聲明

ElementType.TYPE: 類、介面(包括註解類型)或enum聲明

@Documented註解將註解包含在JavaDoc中

@Inheried註解允許子類繼承父類中的註解

以下寫了一個類比註解的案例:

首先寫一個自訂註解@MyAnnotation,代碼如下所示:

package com.pcict.anotation.test;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.METHOD, ElementType.TYPE })public @interface MyAnnotation {    // 為註解添加屬性    String color();    String value() default "我是XXX"; // 為屬性提供預設值    int[] array() default { 1, 2, 3 };    Gender gender() default Gender.MAN; // 添加一個枚舉    // 添加枚舉屬性    MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday = "我的出身日期為1988-2-18");}

寫一個枚舉類Gender,類比註解中添加枚舉屬性,代碼如下所示:

package com.pcict.anotation.test;public enum Gender {    MAN {        public String getName() {            return "男";        }    },    WOMEN {        public String getName() {            return "女";        }    }; // 後面記得有“;”    public abstract String getName();}

寫一個註解類MetaAnnotation,類比註解中添加註解屬性,代碼如下:

package com.pcict.anotation.test;public @interface MetaAnnotation {    String birthday();}

最後寫註解測試類別AnnotationTest,代碼如下:

package com.pcict.anotation.test;// 調用註解並賦值@MyAnnotation(metaAnnotation = @MetaAnnotation(birthday = "我的出身日期為1988-2-18"), color = "red", array = {        23, 26 })public class AnnotationTest {    public static void main(String[] args) {        // 檢查類AnnotationTest是否含有@MyAnnotation註解        if (AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {            // 若存在就擷取註解            MyAnnotation annotation = (MyAnnotation) AnnotationTest.class                    .getAnnotation(MyAnnotation.class);            System.out.println(annotation);            // 擷取註解屬性            System.out.println(annotation.color());            System.out.println(annotation.value());            // 數組            int[] arrs = annotation.array();            for (int arr : arrs) {                System.out.println(arr);            }            // 枚舉            Gender gender = annotation.gender();            System.out.println("性別為:" + gender);            // 擷取註解屬性            MetaAnnotation meta = annotation.metaAnnotation();            System.out.println(meta.birthday());        }    }}

運行AnnotationTest,輸出結果為:

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.