自定义注解实例分析

本文介绍了一个自定义注解Book的创建过程及其在Java中的应用实例。该注解包含书名、价格及作者等属性,并展示了如何通过反射获取这些注解信息。

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

转载于:https://blog.51cto.com/13962277/2172982

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值