使用场景
Java程序执行时有些情况对开发者来说并不清晰,而开发者可以通过HSDB工具来查看一些运行时的情况,比如说在运行时想要查看动态代理创建的代理类。
> 在 JAVA_HOME/lib 目录下,找到 sa-jdi.jar
。
> 以当前路径启动cmd。
java -classpath sa-jdi.jar "sun.jvm.hotspot.HSDB"
提示
点击 File,选择 Attach to HotSpot process(需要输入项目进程Pid)。
> 启动项目,成功后在 IDEA 的 Terminal
中执行以下指令以获取进程号。
netstat -aon | findstr "项目端口号"
提示
若是不清楚端口号也可以在启动前加上下面这段代码一并执行,获取进程ID(取自HuTool工具包)。
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();
}
}
提示
如果你需要看的更直观的话,可以将class保存,再反编译查看细节。
> 把进程号输入进第4步打开的窗口,然后选择 Tools -> Class Browser
。
> 输入 proxy
查找(JDK代理),如下图,可以看到有一个实现了接口的类。
> 点击 Create .class File
,class文件将被存储。
> 还是进入 JAVA_HOME/lib 目录,如下图所示,存储至 com/sun/proxy
目录下。
> 进入 JAVA_HOME/lib/com/sun/proxy
目录,有一个.class文件。
> 把Class文件丢进IDEA,这是反编译的效果。
在命令行启动HSDB工具时,可能会出现找不到
sawindbg.dll
的情况,
它有可能被安装到了JDK目录下的jre/bin
目录下( JAVA_HOME/jre/bin/sawindbg.dll ),
请将它复制到jre/bin目录下即可( JRE_HOME/bin/sawindbg.dll )。