如何在Java中显式调用静态初始化程序?

时间:2015-08-12 01:55:35

标签: java initialization

所以,作为一个例子,我有这个JNI代码:

/** This literally does nothing. It's purpose is to call the static initializer early to detect if we have issues before loading. */
public static void nothing() {

}

static {
    // should be loaded by CLib
    if (CLib.hasGNUTLS() == 1) {
        globalinit();
    }
}

我发现自己从字面上创建了一个名为&#34;没有&#34;如果有必要,可以尽早调用它,但如果之前引用它或者我们不调用nothing(),我也希望它被调用。现在,我可以做一些涉及检查布尔值的讨厌逻辑,但是然后你进入线程安全,等等。我想你可以,但它并不漂亮。有没有办法明确调用GNUTLS.<clinit>();

1 个答案:

答案 0 :(得分:2)

静态初始化程序将始终在您的方法之前运行,因为初始化程序在初始化时运行。 JLS-8.7. Static Initializers说(部分)

  

在类初始化(§12.4.2)时执行类中声明的静态初始化程序。与类变量(§8.3.2)的任何字段初始值设定项一起,静态初始值设定项可用于初始化类的类变量。

并且,您无法显式调用任何初始值设定项(static否则)。但是,Class.forName(String)表示(部分)

  

forName("X")的调用会导致名为X的类被初始化。