在看dubbo源码时,发现dubbo调用过程设计到了很多动态代理类技术,但是这些动态代理类都是运行在内存中的,没有生成class文件,不了解到这些动态代理类的内容,就不知道他的调用过程是什么?
所以在网上找了很多的方式进行尝试,JDK 和 CGLIB 的方式比较简单,只需要进行参数配置
但是javassist的获取就很麻烦,下面将展示如何获取动态代理生成的类信息
主要工具:jvm的HSDB工具
操作系统:windows系统
jdk版本:jdk1.8
1.断点(让程序保持运行状态)
2.打开CMD 命令窗口输入 jps 找到相应的进程 (记住进程号)
3.进程中继续输入
java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
上述的工具已经打开了
4、配置HSDB,File -> Attach to HotSpot process -> 输入进程号 确定
5、获取代理对象类名
我断点userMapper对应代理类的类名是Animal$Adaptive。图片中显示的很明显。
6、根据代理类类名在JVM中查看class
把原先弹出的东西关掉,点击【Tools】-->【Class Browser】-->输入代理类类名
这里userMapper对象显示代理类类名是$Proxy18,下面查找出来一个。
8、class反编译
默认生成的class文件在c盘,我的目录是在C:\Users\13340\org\alexsotob\dubbo\SPI\Animal$Adaptive.class,仔细看下,生成路径它是根据包名生成相应的目录。(注:实在找不到,就在C盘 搜索你的类名)
这里我是放入到Idea中进行查看,可以根据实际自己的需要看