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

本文介绍了如何从JVM中dump出动态代理生成的class,由于这些类以二进制形式加载,通常无法直接查看源码。文中提到了两种方案:一是通过设置环境变量让JVM生成.class文件;二是利用JDK自带的ClassDump工具。ClassDump适用于包括JDK动态代理在内的多种动态生成class的库,如javassist、cglib、asm。
摘要由CSDN通过智能技术生成

由于动态代理生成的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().start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值