自定义注解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();
}
}
原文地址:http://blog.51cto.com/13962277/2172982
时间: 2024-10-10 09:20:41