1、注解解析用到的API AnnotatedElement

AnnotatedElement : 是一个接口,定义了解析注解的方法 :::tips

  1. boolean isAnnotationPresent(Class annotationClass)
    参数 : 注解的字节码对象
    作用 : 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false
    2. T getAnnotation(Class annotationClass)
    参数 : 注解的字节码对象
    返回值 : 根据注解类型获得对应注解对象 , 有了注解对象就可以调用属性(抽象方法),获取属性值 ::: Class,Constructor,Method,Field都会实现AnnotatedElement 接口 :::tips
  • 解析类上的注解:借助字节码对象(Class对象)
  • 解析构造方法上的注解 :借助构造器对象(Constructor对象)
  • 解析方法上的注解 :借助方法对象(Method对象)
  • 解析字段上的注解 :借助字段对象(Field对象) ::: 注解解析案例/*
    1. 定义注解Book,要求如下:
    - 包含属性:String value() 书名
    - 包含属性:double price() 价格,默认值为 100
    - 包含属性:String[] authors() 多位作者
    - 限制注解使用的位置 :类和成员方法上 【Target】
    - 指定注解的有效范围 :RUNTIME 【Retention】

    1. 定义BookStore类,在类和成员方法上使用Book注解
      给成员注入四大名著信息 :
      西游记 —- 施耐庵
      水浒传 —- 吴承恩
      三国演义 —- 罗贯中
      红楼梦 —- 曹雪芹 , 高鹗
      3. 定义Test测试类获取Book注解上的数据

      思路 :
      1. 类型上的注解,使用Class对象解析
      2. 方法上的注解,使用Method对象解析

      API :
      1. boolean isAnnotationPresent(Class annotationClass)
      参数 : 注解的字节码对象
      作用 : 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false
      2. T getAnnotation(Class annotationClass)
      参数 : 注解的字节码对象
      返回值 : 根据注解类型获得对应注解对象 , 有了注解对象就可以调用属性(抽象方法),获取属性值
      */
      class Test {
      public static void main(String[] args) throws NoSuchMethodException {
      Class bookStoreClass = BookStore.class;
      // method(bookStoreClass);

      Method buyMethod = bookStoreClass.getMethod(“buy”);
      boolean annotationPresent = buyMethod.isAnnotationPresent(Book.class);
      if(annotationPresent){
      // 说明方法buy方法上存在Book注解
      Book annotation = buyMethod.getAnnotation(Book.class);
      String value = annotation.value();
      double price = annotation.price();
      String[] authors = annotation.authors();
      System.out.println(value);
      System.out.println(price);
      System.out.println(Arrays.toString(authors));
      }
      }

      private static void method(Class bookStoreClass) {
      /
      boolean isAnnotationPresent(Class annotationClass)
      参数 : 注解的字节码对象
      作用 : 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false
      /
      boolean annotationPresent = bookStoreClass.isAnnotationPresent(Book.class);

      if (annotationPresent) {
      /
      T getAnnotation(Class annotationClass)
      参数 : 注解的字节码对象
      返回值 : 根据注解类型获得对应注解对象 , 有了注解对象就可以调用属性(抽象方法),获取属性值
      /
      // 获取书的注解对象
      Book annotation = bookStoreClass.getAnnotation(Book.class);
      String value = annotation.value();
      double price = annotation.price();
      String[] authors = annotation.authors();

      1. System.out.println(value);<br /> System.out.println(price);<br /> System.out.println(Arrays.toString(authors));<br /> }<br /> }<br />}