上一篇文章讲了动态代理,接着我们来了解下与之相关的注解。
一句话总结:
注解就是通过动态代理实现的。
简单说明:
- 注解的本质是集成了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());
}
}
在运行时,你会发现它生成了一个这东西
这个就是生成的代理类实例,然后通过该实例你就可以获取到注解内容了。