美文网首页
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