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

标签 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();
    }
}

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

最佳答案

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

A static initializer declared in a class is executed when the class is initialized (§12.4.2). Together with any field initializers for class variables (§8.3.2), static initializers may be used to initialize the class variables of the class.

而且,您无法显式调用任何初始化器(staticotherwise)。然而,Class.forName(String)说(部分)

A call to forName("X") causes the class named X to be initialized.

关于java - 如何在 Java 中显式调用静态初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954793/

相关文章:

c++ - 为什么 GCC 不报告未初始化的变量?

c++ - C++ 全局初始化可以有多惰性?

java - 为什么 LinkedHashMap 不提供索引访问?

java - 除了 ConcurrentLinkedQueue,我是否需要使用带锁的 LinkedList?

swift - MKAnnotationView 子类在 Swift 中应该有哪些初始值设定项?

c++ - 为什么我需要在分配时用()初始化动态分配的数组?

C 定义结构体 main 内数组的大小

java - Netty 因多个客户端连接而卡住

java - Java音板-声音不可移植

java - 用于加密的自定义 Maven 插件