所以,作为一个例子,我有这个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();
}
}
我发现自己从字面上创建了一个名为"没有"如果有必要,可以尽早调用它,但如果之前引用它或者我们不调用nothing()
,我也希望它被调用。现在,我可以做一些涉及检查布尔值的讨厌逻辑,但是然后你进入线程安全,等等。我想你可以,但它并不漂亮。有没有办法明确调用GNUTLS.<clinit>();
?
答案 0 :(得分:2)
静态初始化程序将始终在您的方法之前运行,因为初始化程序在类初始化时运行。 JLS-8.7. Static Initializers说(部分)
在类初始化(§12.4.2)时执行类中声明的静态初始化程序。与类变量(§8.3.2)的任何字段初始值设定项一起,静态初始值设定项可用于初始化类的类变量。
并且,您无法显式调用任何初始值设定项(static
或否则)。但是,Class.forName(String)
表示(部分)
对
forName("X")
的调用会导致名为X
的类被初始化。