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

Jav*_*het 6 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现自己实际上创建了一个名为“nothing”的函数,以便在必要时尽早调用它,但我也希望如果它之前被引用或者我们不调用它,则调用它nothing()。现在,我可以做一些涉及检查布尔值的令人讨厌的逻辑,但随后你会进入线程安全,等等。我想你可以,但它并不漂亮。有没有办法显式调用GNUTLS.<clinit>();

Ell*_*sch 6

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

\n\n
\n

类中声明的静态初始值设定项会在类初始化时执行 ( \xc2\xa712.4.2 )。与类变量的任何字段初始值设定项 ( \xc2\xa78.3.2 ) 一起,静态初始值设定项可用于初始化该类的类变量。

\n
\n\n

并且,您无法显式调用任何初始化程序(static其他方式)。然而,Class.forName(String)(部分)说

\n\n
\n

调用forName("X")导致指定的类X被初始化。

\n
\n

  • @JavaProphet你不需要一个什么都不做的方法。只需提及其名称就足够了,例如“MyClass.class;”作为完整的声明。 (3认同)
  • 加载类不会触发初始化该类。 (2认同)