保存java 动态代理生成的字节码文件

保存java 动态代理生成的字节码文件

在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不管是什么动态代理,最后都要动态的生成对应的.class,正常情况下,这个字节码文件并不会保存到本地,只会存在于内存之中。好奇心的驱使之下,决定以探其庐山真面目。经过查阅资料,自己觉得比较好用的两种方案,都在下面了。

1. 方案一:运行 sun.jvm.hotspot.HSDB

通过运行HSDB,可以保存任意运行中的java 项目中的字节码文件。不仅可以保存JDK动态代理的字节码文件,cglib动态代理字节码文件也可以保存。但是这种方式需要一个正在运行中的java项目才可以。

1.1 运行cmd ,运行命令查看windows 的进程id

      web项目的  

      netstat -ano|findstr "8081"

    

    则6152 为web项目进程ID

  

1.1 运行cmd ,运行命令:

如果时win10系统一定采用cmd ,而不要采用 powerShell 运行该命令,会出现找不到类清单的问题。

C:\Users\pc>java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB

1.2 执行命令后会显示如下界面

hsdb界面.png

1.3 选择file-->attach to hotspot process:

attach to hotspot process.png

1.4 cmd 运行 jps

C:\Users\pc>jps
14448 Jps
9044
19016 demo-0.0.1-SNAPSHOT.jar
7016 HSDB
16956 RemoteMavenServer

1.5 在 enter process ID: 输入 19016 点击OK 按钮

1.6 选择 Tools--> Class browser

tools.png

1.7 输入 要查找的 class 文件。

查找到文件之后点击列表 ,下方会展示class详情。如果想保存class file
点击 Create.class File 。
如果不出意外,class 文件已经保存好了。
可以到执行HSDB命令的文件夹下面 查看保存的class文件。
由于我的命令实在 C:\users\pc\目录下面执行的,所以我的文件就保存在这个目录下面。

2. 方案二:IO流保存 动态代理类字节码文件

这种方式 生成的不是代理对象而是字节码的自己数组,所以只能用来保存成文件,用于反编译。

这种方式的优点就是写一个测试方法 就可以拿到代理类字节码文件,比运行HSDB 方便。


 

@Test
    public void testPoxy(){
 byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy", new Class[]{WhcBatchAttributeService.class});
        try(
                FileOutputStream fos =new FileOutputStream(new File("D:/proxyClass/$Proxy.class"))
        ){
            fos.write(bytes);
            fos.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\aaa\\cglib");
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值