注解

作者: 蕊er | 来源:发表于2017-11-01 10:22 被阅读0次

    编写注解

    • 定义

      • 四类原注解

        • @Retention

          ​ SOURCE:源码注解,只在源码中存在,编译成.class文件就不存在了

          ​ CLASS:编译时注解,注解在字节码文件级别可见,在源码和.class文件中都存在

          ​ RUNTIME:运行时注解,注解在整个运行阶段都可见

        • @Target 代表注解修饰的范围:类上使用,方法上使用,字段上使用

          ​ CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)

        • @Documented

          生成javadoc时会包含注解

        • @Inherited

          一个标识性的元注解,它允许子注解继承它

      • 关键字@interface

      • 属性 返回值类型 属性名() [default 默认值]

        • 返回值类型:基本类型,String,Class,注解,枚举以及以上类型的一维数组
        • 如果属性的名字是value,并且注解的属性值有一个 那么在使用注解时可以省略value
    • 使用

      • 注解可以没有属性,如果有属性需要使用小括号括住,例如@Annotation@Annotation(key=value)
      • 属性格式:属性名=属性值,多个属性用逗号隔开
      • 如果属性名为value,且当前只有一个属性,value可以忽略
      • 使用多个属性时,key的值为value不可省略
      • 如果属性类型为数组,设置内容格式为:{1,2,3},例如attrs={a,b}
      • 如果属性类型为数组,值只有一个,{}可以忽略,例如attres=a
      • 一个对象上,注解只能使用一次,不能重复
    • 解析

      @Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      public @interface Desc {
          String value() default "helloword";
      }
      
      @Desc("这是一个类,创建人员对象")
      public class Persion {
          @Desc("这是一个属性,描述人名")
          private String name;
      
          public String getName() {
              return name;
          }
      
          @Desc("这是一个方法用来设置用户名")
          public void setName(String name) {
              this.name = name;
          }
      }
      
      @WebServlet(name = "AnnotationServlet")
      public class AnnotationServlet extends HttpServlet {
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request, response);
          }
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              try {
                  Class clazz = Class.forName("com.learn.annotation.Persion");
                  if (clazz.isAnnotationPresent(Desc.class)) {
                      Desc desc = (Desc) clazz.getAnnotation(Desc.class);
                      System.out.println(desc.value());
                  }
                  Field field = clazz.getDeclaredField("name");
                  //setAccessible
                  if (field.isAnnotationPresent(Desc.class)) {
                      Desc desc = (Desc) field.getAnnotation(Desc.class);
                      System.out.println(desc.value());
                  }
                  Method method = clazz.getMethod("setName", String.class);
                  if (method.isAnnotationPresent(Desc.class)) {
                      Desc desc = (Desc) method.getAnnotation(Desc.class);
                      System.out.println(desc.value());
                  }
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              } catch (NoSuchFieldException e) {
                  e.printStackTrace();
              } catch (NoSuchMethodException e) {
                  e.printStackTrace();
              }
          }
      }
      

      输出:

      ​ 这是一个类,创建人员对象
      ​ 这是一个属性,描述人名
      ​ 这是一个方法用来设置用户名

    相关文章

      网友评论

          本文标题:注解

          本文链接:https://www.haomeiwen.com/subject/ccuwpxtx.html