美文网首页
Java 注解 Annotation

Java 注解 Annotation

作者: bowen_wu | 来源:发表于2021-08-01 17:58 被阅读0次

    概述

    注解(Annotation)就是 class 中的一小段信息 | 文本 | 标记
    注解可以携带参数
    注解可以在运行时被阅读
    java.lang.annotation

    元注解

    元注解 => 可以放在注解上面的注解

    @Target

    注解可以标注在什么东西上

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)   // 只能标注在方法上
    public @interface SpringBootApplication {
    }
    

    @Retention

    这个注解在编译后会不会被保留 => 保留等级 => 保留政策 => java.lang.annotation.RetentionPolicy

    java.lang.annotation.RetentionPolicy

    • SOURCE => 注解会被编译器丢弃 => 反射拿不到
    • CLASS => default => 注解会被保留在字节码中 & 运行期不会保留 => 反射拿不到
    • RUNTIME => 注解会被保留在字节码中,并且在运行期中也会保留 => 反射可以拿到

    @inherited

    注解放在 A 类上,A 的子类上也会出现 A 类上的注解

    @Repeatable

    注解可以重复

    注解的属性

    注解中可以有值,方便注解的复用
    注解的属性类型 => 基本数据类型 + String + 类 以及他们的数组

    public @interface TestAnnotation {
        String[] value() default "Test"; // 属性 value,默认值 Test
    
        String name();  // 属性 name
    }
    
    // 使用
    @TestAnnotation(value = {"Test", "Second", "Third"}, name = "name")
    

    JDK 自带注解

    • @Override => @Target(ElementType.METHOD) + @Retention(RetentionPolicy.SOURCE) => 不写 @Override 也可以正常工作,但是 @Override 可以 check 方法是否覆盖
    • @Deprecated => 已废弃 => @Retention(RetentionPolicy.RUNTIME)
    • @SuppressWarnings => 抑制警告
    • @FunctionalInterface => 函数式接口,标记接口

    注解是如何工作的

    注解仅仅是一段信息,它自己无法工作,如果没有东西处理注解,注解将没有任何用处

    知识点

    1. class 是什么?
      • class 是 Java 类的说明书
      • 可以通过反射 或 JVM 阅读该说明书,创建类的实例
    2. 注解如何放在 package 上 => java.lang.annotation.ElementType.PACKAGE
      • 在 package 下面创建一个 package-info.java
      • package-info.java 中添加注解
    3. package-info.java 作用
      • 可以写一些包的注释,为整个包提供一个注释
      • // TODO
    4. 在字节码中 @LXXX 中的 L 表示虚拟机内部用于表示一个类型的标志
    5. Byte Buddy => Runtime code generation for the Java virtual machine
    6. 所有的注解隐式 extends Annotation,不需要显式书写
      public @interface Test {}
      // 等价于
      public @interface Test extends Annotation {}
      
    7. 反射是一个很慢,效率非常低的操作,如有可能可以将其提至属性,不至于每次调用都进行反射
    8. 装饰器模型 TODO
    9. AOP 切点 PointCut 通知 Advice // TODO

    相关文章

      网友评论

          本文标题:Java 注解 Annotation

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