自定义注解实例分析

自定义注解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();
    }
}

猜你喜欢

转载自blog.csdn.net/zyrdfly/article/details/82468835
今日推荐