自定義註解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();
}
}