Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在与Java运行时关闭挂钩(即StartupHook)相反的等价物?_Java_Shutdown Hook - Fatal编程技术网

是否存在与Java运行时关闭挂钩(即StartupHook)相反的等价物?

是否存在与Java运行时关闭挂钩(即StartupHook)相反的等价物?,java,shutdown-hook,Java,Shutdown Hook,我正在寻找一种与Java运行时中的ShutdownHook完全相反的等价物,即类似于StartupHook的东西,在这种情况下,JVM首次启动时可以执行某些自定义预热或设置代码 我知道在Servlet容器启动时使用ServletContexts等替代方法,或者在其他框架(如Spring等)中使用类似功能。但这些不是我想要的。我正在寻找一个通用的JVM解决方案,如果有的话 请让我知道StartupHook的整个想法是否不适合JVM,以及原因 更新: 在阅读了所有提供的答案之后(谢谢大家),似乎最接

我正在寻找一种与Java运行时中的ShutdownHook完全相反的等价物,即类似于StartupHook的东西,在这种情况下,JVM首次启动时可以执行某些自定义预热或设置代码

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

请让我知道StartupHook的整个想法是否不适合JVM,以及原因

更新: 在阅读了所有提供的答案之后(谢谢大家),似乎最接近我要寻找的是Java代理

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

  • 编写一个只使用一个方法-void preMain()实现StartUpHook的类
  • 将该类放入jar文件,并将该jar放入classpath或JRE extensions目录
  • 当JVM启动时,它会在实现StartUpHook的类路径中查找所有类,然后调用其preMain()方法
  • 你的用例是什么

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

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

    请参阅


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

    只需在您知道将在启动时加载的类中编写一个静态初始值设定项块。

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

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

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

    在调用main的java类中使用静态块怎么样。
    在本例中,静态块的作用类似于启动钩子,除非您想要控制jvm级别的参数

    如何添加启动钩子?我想是通过一些JRE命令行选项?像-Dproperty=value?鼠标上的胖手指,对不起。可能的用例?假设我正在编写一个库,我希望在库的用户出错时运行一些代码。。使用我的库,我不想要求他们显式调用某个App.init()或App.start()方法。经过思考,我想如果这是我的用例,我可以将启动代码添加到库中某个类的某个静态初始化块中。但只有库用户在代码中显式引用该类,而不是在JVM启动时加载库jar时,才会调用它。或者,在JRE 6及更高版本中,当驱动程序jar在类路径中可用时,JVM会自动加载JDBC驱动程序,而无需显式调用class.forName(“jdbc.driver.class”)还有。那些驱动程序开发人员是如何做到这一点的?这是专门针对JDBC驱动程序的JVM本身烘焙出来的吗?我如何在我的库中做到这一点,而不必依赖Oracle来提供这一点?@tsaixingwei DriverManager的api文档告诉您了如何做到的。但是,如果在不同的程序中使用该类,会发生什么呢这并不需要“启动钩子”提供的任何启动行为?也许这样,“启动钩子”就可以检查某些环境变量或命令行属性是否存在(例如,-Dproperty=value)?类的静态初始值设定项块中的代码不是只有在调用方的代码中实际引用该类时才执行吗?我的库的“启动挂钩”是否可能被调用,即使调用方的代码中没有引用它的任何类,但仅仅是被加载的库调用,因为它位于类路径中?例如启动挂钩“仅通过将该库放在类路径中,就可以在后台自动初始化守护进程吗?静态初始值设定项仅在加载类时运行。”。当类第一次被执行线程引用或使用类或类加载器API显式加载时,会加载该类。看看这个问题的其他答案,我想我实际上想做的是提供代理库或Java扩展。Errm。。。如果我正在编写一个由其他控制JVM的人使用的库,我不会控制JVM,因为他们将编写“main”方法并加载我的库。然后在你的库中给他们一个main方法,并告诉他们将其作为main方法调用。请参阅我在上面关于类似automatic的用例的其他注释在JRE 6及更高版本中,无需再显式调用Class.forName(“JDBC.driver.Class”)即可加载JDBC驱动程序。在这种情况下,驱动程序JAR的用户甚至不需要调用库中的任何方法就可以在JVM初始化时加载驱动程序类。当然,这个机制是由JVM供应商的DriverManager实现的。本质上,我正在寻找一个解决方案,通过在类路径中放入一个jar,我的库的用户可以在后台自动执行某些代码