Java 注解 Annotation

2021-08-01  本文已影响0人  bowen_wu

概述

注解(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

@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 自带注解

注解是如何工作的

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

知识点

  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
上一篇 下一篇

猜你喜欢

热点阅读