自定義註解實例分析

自定義註解Book

/*
    說明 : 如果一個註解中僅有一個屬性數據, 那麼請將該註解屬性的名稱定義爲 value.
    好處 : 使用該註解時, 可以省略該屬性的名稱.
 */
// @Target 使用的目標位置
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})

// Retention 保留
// 注意 : 反射必須將 `保留策略` 定義運行時, 沒有選擇.
// @see java.lang.reflect.AnnotatedElement  註解元素接口
@Retention(RetentionPolicy.RUNTIME)

public @interface Book {

    // 書名
    String value();

    // 價格
    int price() default 998;

    // 作者
    String[] authors();
}

BookShelf 類使用註解 :

public class BookShelf {

    String id;

    // 方法 :
    @Book(value = "降龍十九掌", authors = {"張三丰", "滅絕師太"})
    public void showInfo() {

        String value = "";
        int price = 0;
        String[] authors = {};

        System.out.println("value = " + value);
        System.out.println("price = " + price);
        System.out.println("Arrays.toString(authors) = " + Arrays.toString(authors));

    }
}

@Book(value = "降龍十九掌", authors = {"張三丰", "滅絕師太"})
public void showInfo() {

String value = "";
int price = 0;
String[] authors = {};

/*
1. boolean isAnnotationPresent(註解類型)  判斷調用對象是否存在指定註解
2. Annotation getAnnotation(註解類型); 返回指定的註解類型對象.

AnnotationElement 接口 : 實現類有  Class, Method, Filed, Constructor
 */
// 1. 獲取本類的 class 對象
Class<? extends BookShelf> cls = this.getClass();

try {
    // 2. 獲取指定方法對象
    Method method = cls.getMethod("showInfo");

    // 3. 獲取該方法上的指定註解信息
    if (method.isAnnotationPresent(Book.class)) {

        // 4. 獲取信息
        Book book = method.getAnnotation(Book.class);

        // 5. 取出信息
        value = book.value();
        price = book.price();
        authors = book.authors();
    }

} catch (NoSuchMethodException e) {
    // 如果數據有問題, 使用自己內部的, 如果數據正常, 使用註解提供的.
}

System.out.println("value = " + value);
System.out.println("price = " + price);
System.out.println("Arrays.toString(authors) = " + Arrays.toString(authors));

}

測試類

public class AnnotationTest1 {
    public static void main(String[] args) {

        BookShelf bookShelf = new BookShelf();
        bookShelf.showInfo();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章