查看jvm中的动态class

最近在研究动态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 目录

到这里就完成了。

欢迎关注
欢迎关注我的个人公众号

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值