3

我正在寻找 Java 运行时中 ShutdownHook 的一般反向等效项,即类似于StartupHook的东西,在 JVM 首次启动时可以执行某些自定义预热或设置代码。

我知道在启动 Servlet 容器时使用 ServletContexts 等替代方案,或者在 Spring 等其他框架中使用类似的功能。但这些不是我想要的。我正在寻找一个通用的 JVM 解决方案,如果有的话。

请让我知道 StartupHook 的整个想法是否不适合 JVM 以及为什么。

更新:在浏览完所有提供的答案(谢谢大家)之后,似乎最接近我正在寻找的是 Java 代理。

虽然如果JVM允许我做这样的事情会很好(从易用的角度来看,但可能不是从安全的角度来看):

  1. 编写一个只用一种方法实现 StartUpHook 的类 - void preMain()
  2. 将该类放入 jar 文件并将该 jar 放入类路径或 JRE 扩展目录
  3. 当 JVM 启动时,它会在类路径中查找所有实现 StartUpHook 的类,然后调用它的 preMain() 方法。
4

5 回答 5

3

Java 中没有启动钩子。您的选择是(按照我推荐的顺序)。

  • 使用您正在运行的框架(即 Servlet、Spring 等)的启动回调功能。这还包括简单地让编写 main 方法的人给你一个回调。
  • main(String[])用您自己的方法包装该方法main(String[]),然后在从命令行调用您的 main 后委托。
  • 在 jar 清单中创建一个带有定义的java 代理Premain-Class库,然后在命令行上将代理添加到 JVM。

最后两个选项要求您在命令行上添加或更改内容。

于 2013-07-30T00:38:22.647 回答
2

你的用例是什么?

关闭挂钩有用的唯一原因是您不知道JVM何时会关闭。某些代码可能会意外调用System.exit,或者 GUI 中的所有窗口都可能关闭,这将终止 JVM。

另一方面,你总是知道 JVM 什么时候启动。将您需要在启动时运行的任何代码放入您的main方法中。

于 2013-07-29T23:42:25.323 回答
1

只需在您知道将在启动时加载的类中编写一个静态初始化程序块。

于 2013-07-30T00:01:47.610 回答
0

请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

您必须是代理库并定义一个 pre-main 方法。

于 2013-07-29T23:48:42.377 回答
0

在调用 main 的 java 类中使用静态块怎么样。在这种情况下,静态块就像一个启动钩子,除非你想控制 jvm 级别的参数

于 2014-01-29T01:52:19.370 回答