【问题标题】:How to explicitly call the static initializer in Java? [duplicate]如何在 Java 中显式调用静态初始化程序? [复制]
【发布时间】:2015-08-12 01:55:34
【问题描述】:

所以,作为一个例子,我有这个 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”的函数,以便在必要时尽早调用它,但我也希望在它被更早引用或我们不调用 nothing() 时调用它。现在,我可以做一些涉及检查布尔值的讨厌的逻辑,但是你会进入线程安全,等等。我想你可以,但它并不漂亮。有没有办法显式调用GNUTLS.<clinit>();

【问题讨论】:

  • 只是为了澄清:nothing 方法的目的只是为了确保类已经被加载,对吧?您需要加载该类以使其静态初始化程序运行,即使您不需要对该类执行任何操作else,但除了让 JVM 加载它。

标签: java initialization


【解决方案1】:

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

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

而且,您无法显式调用任何初始化程序(static否则)。但是,Class.forName(String) 说(部分)

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

【讨论】:

  • 是的,我知道。那不是我的问题。您必须引用要加载的类,然后调用静态初始化程序,因此 nothing() 来引用该类。
  • 你可以看看Class.forName(String)。是的,您必须引用一个类才能加载它。
  • 不清楚,但我认为这个想法是调用一个无所事事的方法来触发类加载 - 而不是以某种方式从 within 方法调用静态初始化器(再次) .
  • @JavaProphet 你不需要什么都不做的方法。只需提及它的名称就足够了,例如MyClass.class; 作为一个完整的声明。
  • 加载类不会触发初始化类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2012-09-15
  • 2017-08-27
  • 1970-01-01
相关资源
最近更新 更多