最近在研究动态class的相关特性问题,经常需要查看正在运行的java程序中动态生成的class文件,以下是查看方式。
一、必要的工具
jdk:windows下 jdk7及以上、liunx下 jdk6及以上
说明:HSDB是sun官方推出的一个java虚拟机debug的工具,liunx下jdk6自带了,windows下jdk7自带了。这个工具可以做很多事情,有兴趣的自己去学学吧,可以见识到jvm最底层的东西了。
jd-gul:请到官网下载 http://jd.benow.ca/
说明:java反编译工具。
二、示例
需求:用cglib基于com.bassis.bean.test.TestAopServiceImpl 动态创建了一个子类,需要查看这个动态创建的子类class文件内容。
1、debug运行mian函数,最后一行打断点,防止动态创建的class类被清除。
2、查看pid进程:jps -lm
当前第一个32816 为当前main函数进程,已经被断点断住。
2、打开 HSDB工具:sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
点击file下的第一个菜单
在弹出的窗口中输入刚才得到的mian函数的 pid
点击ok按钮后
到这里为止sun.jvm.hotspot 的大门已经完全向你敞开,可以干很多事情了,这里我只拿来寻找动态创建的class。
回到正题
点击tools 下第一个菜单
弹出的窗口中
点击第二个cglib生成的子类 public class com.bassis.bean.test.TestAopServiceImpl$$EnhancerByCGLIB$$5794b6db @0x00000007c00c6a7
点击 Create .class File 生成文件,文件路径在当前执行HSDB工具的目录下,会以包名为文件夹生成
HSDB工具启动目录为:/Users/liucheng
因为我的原始class是com.bassis.bean.test,所以 /com/bassis/bean/test 这一段是存放class文件的地方,一个是父类class原始文件,一个是cglib生成的文件。这些文件是二进制的,所以需要jd-gul工具反编译。
3、打开jd-gul工具
选择到 /Users/liucheng/com/bassis/bean/test 目录
到这里就完成了。
![欢迎关注](https://img-blog.csdnimg.cn/20200116213424520.jpg)