本文内容
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文件