从JVM中dump出动态代理生成的class(

(转载https://segmentfault.com/a/1190000011608393

由于动态代理生成的class是直接以二进制的方式加载进内存中的,并没有对应的.class文件生成,所以如果想通过反编译工具查看动态代理生成的代码需要通过特殊的手段来处理。

方案一
设置运行环境变量,运行后会把class文件生成在classpath目录下

//动态代理时生成class文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
缺点是只适用于JDK动态代理

方案二
使用ClassDump,可以dump出JVM中所有已加载的class。ClassDump位于$JAVA_HOME/lib/sa-jdi.jar中(注:windows版本JDK从1.7开始才有此工具),直接以命令行执行。

查看PID

E:\work\Test\bin>jps

缺省输出该PID下所有已加载的class文件至./目录

E:\work\Test\bin>java -classpath ".;./bin;%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.tools.jcore.ClassDump <PID>
//导入sa-jdi.jar包,实现ClassFilter接口,只输出匹配的class文件
public class MyFilter implements ClassFilter{

@Override
public boolean canInclude(InstanceKlass arg0) {
    return arg0.getName().asString().startsWith("com/sun/proxy/$Proxy0");
}

}

查看PID

E:\work\Test\bin>jps

使用ClassFilter输出匹配的class文件,并指定输出目录

E:\work\Test\bin>java -classpath ".;./bin;%JAVA_HOME%/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=proxy.MyFilter -Dsun.jvm.hotspot.tools.jcore.outputDir=e:/dump sun.jvm.hotspot.tools.jcore.ClassDump <PID>
此方案基于JVM层的ClassDump所以可以支持javassist、cglib、asm动态生成的class。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,694评论 19 139
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,224评论 0 3
  • 在小时候我喜欢看动画片,不喜欢读书,妈妈给我买了许多带图画的绘本,我光看图不看字不认识,所以我就不喜欢看书...
    格林家的公主_9aa3阅读 204评论 0 0
  • 杨初尘阅读 223评论 0 3
  • 我家有个小荷塘。说是荷塘,其实就是用以前的马厩改制而成的。因为现在没有马了,所以也算是废物利用吧。想来用作荷塘已经...
    容姐心语阅读 652评论 10 3

友情链接更多精彩内容