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

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

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

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

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

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\目录下面执行的,所以我的文件就保存在这个目录下面。

class browser.png

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();
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,312评论 19 139
  • Understanding bytecode makes you a better programmer 前言 作...
    Windy_816阅读 15,284评论 3 20
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,429评论 11 349
  • “你不在这吃点吗?听说这边阿姨的菜烧的很好吃哦!” “看看别人家的阿姨菜烧的,再看看我们家的阿姨烧的!” “看看别...
    ganweif阅读 1,124评论 0 0
  • 写了五行关于火的诗 两行烧茶 两行留到冬天取暖 剩下的一行 送给你在停电的晚上读我
    我们的黄金时代阅读 10,068评论 1 1