【问题标题】:How do we Load Classes on JVM start (straight away)?我们如何在 JVM 启动时(直接)加载类?
【发布时间】:2012-02-10 22:34:31
【问题描述】:

大家下午好,

我想知道即使没有引用类本身,是否也可以让类的静态块运行?

我知道它是延迟加载的,因此只需调用该类的任何函数即可开始初始化该类,

但是我希望在任何调用之前启动该类,换句话说,我希望它在 JVM 启动时运行,无论它是否被引用。

Preloading java classes/libraries at jar startup 建议了一个解决方法,但它并不是我真正想要的解决方案(基本上我不想做Class.forName,我希望它在 JVM 启动时完成)

我们将如何去做?

【问题讨论】:

  • 想知道你在做什么?您可以在 public static void main 方法中加载您需要的任何内容,因为这是任何应用程序的起点。您无权访问此代码,在 Web 应用程序的情况下使用 load-on-startup servlet(listener, filter)。或者如果它不是网络应用程序的另一种方法
  • @Umar 我有一个库,可以处理一些日志记录。基本上我希望它在开始时做一些事情(只要引用了库),但不必在 main 方法开始时MyLibrary.Init.Init()
  • 这有点循环。您希望在启动时加载类而不以特定方式在启动时加载类。看起来你想要一些感觉更自动的东西。值得注意的是,积极加载类不会导致这些类中的方法编译。我会练习关键的方法,这会导致类被加载。
  • @PeterLawrey 我不确定我是否理解你的意思,是的,我想在启动时加载类,而不是以特定方式在启动时加载类。例如,我们不关心是 java.lang.X 先加载还是 java.lang.Y 先加载。我只想加载它们。
  • 因此,您可以创建要加载的类文件(或从应用程序的先前运行生成它)并循环加载它们。但是,如果您出于性能原因这样做,则最好使用用于强制它们编译的关键方法。

标签: java jvm


【解决方案1】:

如果有办法做到这一点,它可能会涉及使用 JVM 选项,这并不完全优雅或完全可移植。

如果您只需要在执行实际应用程序代码之前初始化某个类,则在现有应用程序周围使用包装类可能是一种更简洁的选择:

public class LoggedLauncher {
    public static void main(String[] args) {
        // Do whatever you need to initialize your logging class
        //
        // e.g. call a static method:
        //
        // MyLogger.init();

        // ...then start your application
        MyApplication.main(args);
    }
}

您甚至可以使用一些反射,以便可以将应用程序类作为参数提供给包装器,从而替换硬编码的引用。如果这样做,请不要忘记操作 args 数组,以便将正确的参数传递给应用程序的 main() 方法。

【讨论】:

  • 是的,您知道哪些 JVM 选项允许我们这样做吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多