Java高级编程知识—7、注解Annotation

7、注解Annotation

7.1 概述

  1. 从JDK5.0 开始,Java增加了对元数据(MetaData)的支持,也就是注解(Annotation)

    Annotation就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取并执行相应的操作

    通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息,代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署

    Annotation可以像修饰符一样使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name=value”对中

  2. 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能(@Deprecated),忽略警告等

    在JavaEE/Android中注解发挥了更重要的作用,例如用来配置应用程序的任何切面,代替JavaEE旧版中遗留的繁冗代码和XML配置等

  3. 未来的开发模式都是基于注解的,JPA、Spring2.5后、Hibernate3.x后、部分Structs都是基于注解的

  4. 框架 = 注解 + 反射 + 设计模式

7.2 使用示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnRXT8qt-1641822818201)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220108233415291.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nipkLuHx-1641822818202)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220108233748360.png)]

7.3 自定义注解

  1. 注解声明为@interface
  2. 内部定义成员,通常用value表示
  3. 可以指定成员的默认值,使用default定义
  4. 如果自定义注解内部没有成员,标明起标识作用,例如@Override
  5. 如果有成员,在使用注解时,需要指明成员的值

注:自定义注解必须配上注解的信息处理流程(反射)才有意义

​ 自定义注解通常都会指明两个元注解:Retention、Target

public @interface MyAnnotation{
	String value() default "hello";
}

7.4 元注解

修饰其他注解的注解

  • Retention:用于指定被修饰的注解的生命周期,@Retention包含一个RetentionPolicy类型的成员变量,使用时必须为该value成员变量指定值
    • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注解
    • RetentionPolicy.CLASS(默认值):在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解
    • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释,程序可以通过反射获取该注解
  • Target:用于指定被修饰的注解能用于修饰哪些程序元素(如类型TYPE、构造器CONSTRUCTOR、方法METHOD等)
  • Documented:其所修饰的注解在被javadoc解析时,会被保留
  • Inherited:其所修饰的注解将具有继承性。如果某个类使用了被@inherited修饰的注解,则其子类将自动具有该注解

jDK8新增元注解:

  • Repeatable:可重复注解

    • 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class

    • MyAnnotation和MyAnnotations的修饰目标Target生命周期Retention等元注解需相同

    • @Repeatable(MyAnnotations.class)
      @Retention(RetentionPolicy.RUNTIME)
      @Target({METHOD,TYPE,CONSTRUCTOR})
      public @interface MyAnnotation {
          String value();
      }
      
    • @Retention(RetentionPolicy.RUNTIME)
      @Target({METHOD,TYPE,CONSTRUCTOR})
      public @interface MyAnnotations {
          MyAnnotation[] value();
      }
      
    • //@MyAnnotation("hello")
      //@MyAnnotation("hi")
      @MyAnnotations({@MyAnnotation("hello"),@MyAnnotation("hi")
      class Xxx{
          ...
      }
      
  • 类型注解:

    • ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中(如泛型声明

    • ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中

    • @MyAnnotations({@MyAnnotation("hello"),@MyAnnotation("hi")})
      class Person<@MyAnnotation T>{
          String name;
          int age;
          public void show() throws  @MyAnnotation  RuntimeException{
              List<@MyAnnotation String> list = new ArrayList<>();
              int i = (@MyAnnotation int)999L;
          }
      }
      

我的学习笔记有更多精彩内容哦
Java编程知识专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值