Java工具

使用HSDB工具查看运行时的类文件

Memory

593字约2分钟

JavaHotspot Debugger

2024-04-16

使用场景

Java程序执行时有些情况对开发者来说并不清晰,而开发者可以通过HSDB工具来查看一些运行时的情况,比如说在运行时想要查看动态代理创建的代理类。


1. 打开HSDB工具

>   在 JAVA_HOME/lib 目录下,找到 sa-jdi.jar

hero



2. 启动CMD

>   以当前路径启动cmd。

hero



3. 通过命令启动HSDB工具

java -classpath sa-jdi.jar "sun.jvm.hotspot.HSDB"

hero



4. 挂载进程

提示

点击 File,选择 Attach to HotSpot process(需要输入项目进程Pid)。

hero



5. 启动项目,获取进程ID

>   启动项目,成功后在 IDEA 的 Terminal 中执行以下指令以获取进程号。

netstat -aon | findstr "项目端口号"

hero

提示

若是不清楚端口号也可以在启动前加上下面这段代码一并执行,获取进程ID(取自HuTool工具包)。

获取进程ID
public static int getPid() {
    final String processName = ManagementFactory.getRuntimeMXBean().getName();
    if (StringUtils.isBlank(processName)) {
        throw new RuntimeException("Process name is blank!");
    }
    final int atIndex = processName.indexOf('@');
    if (atIndex > 0) {
        return Integer.parseInt(processName.substring(0, atIndex));
    } else {
        return processName.hashCode();
    }
}


6. 查看Class

提示

如果你需要看的更直观的话,可以将class保存,再反编译查看细节。

>   把进程号输入进第4步打开的窗口,然后选择 Tools -> Class Browser
>   输入 proxy 查找(JDK代理),如下图,可以看到有一个实现了接口的类。

hero



7. 保存Class文件

>   点击 Create .class File,class文件将被存储。
>   还是进入 JAVA_HOME/lib 目录,如下图所示,存储至 com/sun/proxy 目录下。
>   进入 JAVA_HOME/lib/com/sun/proxy 目录,有一个.class文件。

hero

hero



8. 反编译Class文件

>   把Class文件丢进IDEA,这是反编译的效果。

hero



问题解决

在命令行启动HSDB工具时,可能会出现找不到 sawindbg.dll 的情况,
它有可能被安装到了JDK目录下的 jre/bin 目录下( JAVA_HOME/jre/bin/sawindbg.dll ),
请将它复制到jre/bin目录下即可( JRE_HOME/bin/sawindbg.dll )。

hero