注解详解(运行时注解)

247 阅读1分钟

上一篇文章讲了动态代理,接着我们来了解下与之相关的注解。

一句话总结:

注解就是通过动态代理实现的。

简单说明:

  • 注解的本质是集成了Annotation的接口
  • 以动态代理的方式生成代理类
  • 通过反射获取注解内容

基本原理

注解本质上是先声明一个接口,在运行时会生成接口的代理类(动态代理原理),然后通过该代理类实例进行一些操作。

注解分类

  • 元注解:用于注解的注解
    • @Target:注解的作用目标
    • @Retention:注解的生命周期
    • @Documented:注解是否应当被包含在JavaDoc文档中
    • @Inherited:是否允许子类继承该注解
  • 内置注解:以API形式提供给开发者常用注解
    • @Override
    • @Deprecated
    • @SuppressWarnings
  • 自定义注解

具体实例

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SayHello {
    String value();
}

相当于

public interface SayHello extends Annotation {
    String value();
}

使用时

public class Main {

    @SayHello("Hello")
    public void hi() {
        System.out.println("hi");
    }

    public static void main(String[] args) throws NoSuchMethodException {
        SayHello sayHello = Main.class.getMethod("hi").getAnnotation(SayHello.class);
        System.out.println(sayHello.value());
    }
}

在运行时,你会发现它生成了一个这东西

截屏2021-06-21 下午6.21.11.png 这个就是生成的代理类实例,然后通过该实例你就可以获取到注解内容了。