在阅读框架代码的时候,我们经常碰到自动生成的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文件方法