闲来无事,逛GitHub的一个博客项目时,发现作者在应用启动初始换临时文件夹时,使用了如下的一个操作:
```java
public static Path createTempDirectory() throws IOException {
final var tempDirectory = Files.createTempDirectory("halo");
Runtime.getRuntime().addShutdownHook(new Thread(() -> deleteFolderQuietly(tempDirectory)));
return tempDirectory;
}
```
创建完临时文件夹后,先给JVM扔了一个ShutdownHook,然后才将临时文件夹的创建结果返回。原来,这个ShutdownHook作用是在程序终止时,jvm退出前执行一些操作,比如上述的代码中的作用就是删除应用启动时初始化的临时文件夹。
于是乎,我也做了个尝试,新建一个SpringBoot Demo并启动,通过请求的方式添加Hook到JVM中,然后尝试停止应用,Bingo,成功输出想要的结果。
New一个SpringBoot Demo项目
![image.png](https://miantiao.online/upload/2022/11/image-ddf8ae52efe14e90895138de051dcb24.png)
定义一个添加Hook的方法
![image.png](https://miantiao.online/upload/2022/11/image-044b929345954970a1e944460fd18553.png)
定义一个用于触发添加Hook的入口
![image.png](https://miantiao.online/upload/2022/11/image-75b38ebe4e534b7eab81f3ba286ca4fc.png)
启动项目后,调用几次接口,然后尝试停止该项目,就可以看到,在应用停止前,打印出了想要的内容!
![image.png](https://miantiao.online/upload/2022/11/image-01c4c1b7f100426e8999034ba56878ee.png)
![Java Hook的第一次尝试](https://miantiao.online/upload/2021/01/wallhaven-48mkmj-b5ef21b159ec4a8681adec78edc8d5a8.jpg)
Java Hook的第一次尝试