【发布时间】: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 先加载。我只想加载它们。
-
因此,您可以创建要加载的类文件(或从应用程序的先前运行生成它)并循环加载它们。但是,如果您出于性能原因这样做,则最好使用用于强制它们编译的关键方法。