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>();?
静态初始化程序将始终在您的方法之前运行,因为初始化程序在类初始化时运行。JLS-8.7。静态初始化器说(部分)
\n\n\n\n\n类中声明的静态初始值设定项会在类初始化时执行 ( \xc2\xa712.4.2 )。与类变量的任何字段初始值设定项 ( \xc2\xa78.3.2 ) 一起,静态初始值设定项可用于初始化该类的类变量。
\n
并且,您无法显式调用任何初始化程序(static或其他方式)。然而,Class.forName(String)(部分)说
\n\n调用
\nforName("X")导致指定的类X被初始化。