37Java的注解

注解使程序更加简洁,花更少的力气完成更多的工作——这也是计算机的意义所在。

  • 什么是注解
  • 运行时获取注解信息

注解是什么

  • 还记得Class是什么么?
    • Class是Java类的说明书
    • (通过反射)或者JVM阅读该说明书,创建类的实例 * 注解就是说明书中的一小段信息/文本/标记
  • 注解就是说明书中的一小段信息/文本/标记
    • Annotation
    • 可以携带参数
    • 可以在运行时被阅读

注解的写法

  • 新建一个类的时候选择注解
  • 元注解
    • @Rentention
    • 用于描述注解的生命周期
    • @Retention(RetentionPolicy.SOURCE)// 表示一个注解可以存在于源码中==>java的源码中
    • @Retention(RetentionPolicy.CLASS)// 表示 一个注解可以在源码中,并且可以在字节码文件中
    • *@Retention(RetentionPolicy.RUNTIME)// 表示 一个注解可以在源码、字节码、及运行时期该注解都会存在**
    • @Target
    • 此注解说明注解的作用目标,默认值为任何元素。取值有以下:
    • @Target(ElementType.TYPE)// 接口、类、枚举、注解
    • @Target(ElementType.FIELD)// 字段、枚举的常量
    • @Target(ElementType.METHOD)// 方法
    • @Target(ElementType.PARAMETER)// 方法参数
    • @Target(ElementType.CONSTRUCTOR)// 构造函数
    • @Target(ElementType.LOCAL_VARIABLE)// 局部变量
    • @Target(ElementType.ANNOTATION_TYPE)// 注解
    • @Target(ElementType.PACKAGE)//包
    • @Documented
    • @Inherited
    • @Repeatable

注解的属性

  • 可以有哪些?
    • 基本数据类型+String+类以及它们的数组
  • 默认值
  • 名为value的属性

jdk的自带注解

  • @Deprecated// 废弃掉,中划线
  • @Override// 重写
  • @SuppressWarnings
  • @Functionallnterface

注解是如何工作的?

  • 注解仅仅是一段信息,它自己无法工作
  • 换句话说,没有东西处理它们的话,注解没有任何卵用

通过反射获取注解

  • Method.getAnnotation
  • Class.getAnnotation

我们来通过反射处理一下注解

基于注解的日志实现

  • @Log注解
  • Byte Buddy maven
  • 在运行时,拦截方法的进入和退出,打印相应的日志

基于注解的缓存实现

  • @Cache 注解
  • 如果缓存中不存在方法调用的结果
  • 调用真实的方法
  • 将结果放入缓存
  • 如果缓存中已经存在结果,检查是否过期,如果过期
  • 调用真实的方法
  • 将结果放入缓存
  • 否则,缓存中存在结果且不过期
  • 直接返回缓存中的结果

练习

基于注解的缓存装饰器

「资料来源:饥人谷」

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注