4、注解与反射
通过前文可知,注解本质上时继承了Annotation接口的接口。另外,我们可以从虚拟机的层面来分析注解的本质。
首先自定义一个注解类型:
@Target(value = {ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Hello {
String value();
}
上述定义指明这个注解只能修饰字段和方法,并且该注解永久存活,以便我们反射获取。
虚拟机规范定义了一系列和注解相关的属性表。无论是字段、方法或是类本身,如果被注解修饰了,就可以被写进字节码文件。属性表有以下几种:
- RuntimeVisibleAnnotations:运行时可见的注解
- RuntimeInVisibleAnnotations:运行时不可见的注解
- RuntimeVisibleParameterAnnotations:运行时可见的方法参数注解
- RuntimeInVisibleParameterAnnotations:运行时不可见的方法参数注解
- AnnotationDefault:注解类元素的默认值
上述属性表显示了注解在字节码文件中存储方式。因此对于一个类或接口,Class类中提供了下列方式用于反射:
- getAnnotation:返回指定的注解
- isAnnotationPresent:判定当前元素是否被指定注解修饰
- getAnnotations:返回所有的注解
- getDeclaredAnnotation:返回本元素的指定注解
- getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的
用例:
首先设置一个虚拟器启动参数,用于捕获JDK动态代理类。
-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

本文深入探讨Java注解的工作原理及其与反射的关系。通过自定义注解和虚拟机规范的角度,详细解释了注解如何在字节码级别存储及通过Class类进行反射操作的方法。
https://www.bilibili.com/video/BV1qL411u7eE?from=search&seid=2322669758623357936&spm_id_from=333.337.0.0
641

被折叠的 条评论
为什么被折叠?



