Java自定義註解Annotation詳解

註解至關於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記,之後,javac編譯器,開發工具和其餘程序能夠用反射來了解你的類及各類元素上有無何種標記,看你有什麼標記,就去幹相應的事。標記能夠加在包,類,字段,方法,方法的參數以及局部變量上。java

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

    //......
}

Java中提供了四種元註解,專門負責註解其餘的註解,分別以下:數組

@Retention元註解,表示須要在什麼級別保存該註釋信息(生命週期)。可選的RetentionPoicy參數包括:工具

RetentionPolicy.SOURCE: 停留在java源文件,編譯器被丟掉
開發工具

RetentionPolicy.CLASS:停留在class文件中,但會被VM丟棄(默認)測試

RetentionPolicy.RUNTIME:內存中的字節碼,VM將在運行時也保留註解,所以能夠經過反射機制讀取註解的信息spa

@Target元註解,默認值爲任何元素,表示該註解用於什麼地方。可用的ElementType參數包括code

ElementType.CONSTRUCTOR: 構造器聲明對象

ElementType.FIELD: 成員變量、對象、屬性(包括enum實例)blog

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,輸出結果爲:

相關文章
相關標籤/搜索