https://juejin.cn/post/6844903511809851400 1.注解的分类
Java的注解分为元注解和标准注解。
标准注解 SDO
元注解
@Documented
是一个标记注解,没有成员变量。 会被JavaDoc 工具提取成文档
@Target(METHOD,TYPE类,FIELD用于成员变量,PACKAGE用于包) 表示被描述的注解用于什么地方
@Retention
描述注解的生命周期
SOURCE:在源文件中有效(即源文件保留) CLASS:在 class 文件中有效(即 class 保留) RUNTIME:在运行时有效(即运行时保留)
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Documented – 注解是否将包含在JavaDoc中 @Retention – 什么时候使用该注解 @Target – 注解用于什么地方 @Inherited – 是否允许子类继承该注解
注解的底层实现原理
注解的原理:
注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。
而我们通过反射获取注解时,返回的是Java 运行时生成的动态代理对象$Proxy1。
通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke方法。