探究java注解底层实现原理,首先自定义一个注解类
1 | import java.lang.annotation.Retention; |
再定义个main函数类来使用该注解
1 | "Test") (name= |
运行javac *.java编译成class文件,通过javap查看字节码可知:注解是一种继承自接口java.lang.annotation.Annotation
的特殊接口
1 | [qiaojian0] testannotation ]% javap MyTypeAnnotation [ |
接口是怎么直接使用的呢?还是通过java中万能的动态代理实现的,动态代理会在运行时生成一个实现了MyTypeAnnotation接口的类实例,并设置上我们配置的注解属性值,然后通过反射获取。我们可以通过加上运行参数-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true生成动态代理类class文件
1 | [qiaojiantrue TestMyTypeAnnotation testannotation ]% java -Dsun.misc.ProxyGenerator.saveGeneratedFiles= |
反编译查看class文件可知:生成的代理类实现了MyTypeAnnotation接口
1 | [qiaojian0] proxy ]% javap \$Proxy1 [ |
最后,我们可以通过HotSpot DeBuger工具来实时查看一下注解的实现和值是否和我们预期一样
首先,执行java,将程序跑起来
1 | [qiaojian0] testannotation ]% java TestMyTypeAnnotation [ |
然后ps查看进程ID:88954
1 | [qiaojian0] testannotation ]% psfind TestMyTypeAnnotation [ |
打开HSDB
1 | [qiaojian testannotation ]% sudo java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB |
attach 进程ID
查看堆内存参数
查看注解的实现类实例
查看注解属性的设置值
使用HSDB可以方便的查看java 进程的运行时数据状态,方便debug