快速查看java动态生成class内容的方法

在阅读框架代码的时候,我们经常碰到自动生成的class类,例如jdk中动态代理类、cglib代理类、spring AOP代理以及method.invoke()方法中自动生成的类GeneratedMethodAccessor1、以及lambda表达式等等。其中jdk、cglib以及lamb解析中都会提供一个系统配置,在生成代理类的时候,会将类的字节码写入到项目文件夹的文件中。例如:

jdk中生成动态代理时,设置系统配置  -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true。程序运行中使用到jdk的动态代理时,就会在项目文件夹下生成一份代理类的class文件。

通过配置项自动生成动态类的class文件,对于只研究jdk动态代理的人来说足够使用了。但是,当我们想要了解更多的其他动态类的生成方法时,却有很多限制。例如,很多动态class类不会提供自动生成class文件的方法,还有就是查找配置项略显麻烦。

下面提供一种通用的查看动态class信息的方法:

1.在程序中,在动态类生成之后的任意一处设置一个断点:

2. 新建一个文件夹,在文件夹中新建一个hsdb.bat文件,用记事本打开bat文件,写入以下内容:

java -classpath "C:\Program Files\Java\jdk1.8.0_172\lib\sa-jdi.jar" sun.jvm.hotspot.HSDB

将C:\Program Files\Java\jdk1.8.0_172改成你的%JAVA_HOME%地址。

3.双击执行hsdb.bat,出现如下界面:

4.点击file->Attach to HotSpot process,然后通过在控制台通过"jps -l"命令查询进程id,确定需要连接的程序:

这一步中有可能出现因jre中缺失sawindbg.dll而导致异常,解决办法就是从jdk目录下查找该dll文件,然后拷贝到jre\bin目录下,重新连接虚拟机就可以了。

5.点击Tools->class Browser,查看当前进程的所有类:

6.点击选中需要查看的动态类,然后点击下面的create .class file,动态类就生成了:

 

 

7.接着,在浏览器中打开网址:http://javare.cn/,对生成的class文件在线反编译:

8.最后反编译结果如下:

文章的最后要感谢博客作者提供的方法:查看CGLib生成的class文件方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值