java使用HSDB输出内存中定义的类

 本文内容

               1.内存中定义一个Java类

               2.HSDB使用方法及注意事项

               3.java类的反编译

前言

        众所周知,java类原始的字节码数据一般存储在磁盘中。在文件被载入内存之后,可以通过ClassLoader类的DefineClass将字节码数组转换成一个java类,所以也可以通过在内存中定义一个字节数组直接去定义一个java类。比如,我们想深入了解一下java动态代理的机制,最好的办法就是阅读动态生成的目标类的源代码,但是如何去获取它的源代码呢。动态代理类可以通过设置系统属性sun.misc.ProxyGenerator.saveGeneratedFiles 将类的字节码进行存盘,但是这不具有通用性。对于从类文件中定义的类,如果想要查看它的源代码,可以通过反编译手段去获取一个类文件的源代码;而对于从内存数组中定义的类,如果想要查看它的源代码,则首先需要将内存中的类字节码数据输出到一个文件,然后再根据类文件获取源代码,因为反编译工具需要接收文件的输入。我们可以通过Demo来理解这个过程。

1.内存中定义一个java类

           首先通过反射获取ClassLoader类的DefineClass方法,再反射调用该方法定义类

           

2.HSDB使用方法及注意事项

          HSDB是jdk安装目录下面的jar包文件,文件位于jdk安装目录\lib下面 ,它以独立进程的形式存在,能够以无侵入式的方式在java进程外获取java的运行时的信息

 可以在命令行java -cp sa-jdi.jar sun.jvm.hotspot.HSDB java进程id 来启动监控进程

       要注意的是, 在命令行运行需要管理员权限,可以通过jps查找java进程id

  以非管理员启动时会报错

 以管理员启动

 成功附加到java进程后主页会列出所有java进程,可以通过点击菜单 tools =>class browser查看

已加载的所有类

 XBootMain就是我们直接使用ClassLoader的defineClass定义的

 点击上方XBootMain类信息,在下方区域显示了 创建类文件的超链接

 点击 "Create .class File" 链接,会在sa-jdi.jar同目录下生成XBootMain.class类文件

3. java类的反编译

        可以使用java-decompiler.jar对java类文件进行反编译,命令为

 

可以看到, 反编译完成后在同目录生成了java文件

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天水麒麟姜伯约

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值