何时执行类的静态块?

Leo*_*eon 69 java initialization

我有2个罐子,我们称之为a.jar和b.jar.

b.jar取决于a.jar.

在a.jar中,我定义了一个类,我们称之为StaticClass.在StaticClass中,我定义了一个静态块,调用名为"init"的方法:

public class StaticClass {
  static {
    init();
  } 

  public void static init () {
    // do some initialization here
  }
}
Run Code Online (Sandbox Code Playgroud)

在b.jar中,我有一个main,所以在main中,我希望已经调用了init()方法,但实际上并没有.我怀疑是因为静态类没有被jvm加载,任何人都可以告诉我

  1. 我的结论是否正确?
  2. 触发jvm加载类的原因是什么?
  3. 如何自动执行静态块?

谢谢

Łuk*_*man 90

是的,你是对的.当JVM(类加载器 - 要特定)加载时StaticClass(第一次在代码中引用时),就会运行静态初始化块.

您可以通过显式调用StaticClass.init()哪个优先依赖于JVM 来强制调用此方法.

您还可以尝试使用Class.forName(String)强制JVM加载类并调用其静态块.

  • "当JVM加载StaticClass`时运行静态初始化块---不正确,类加载与类初始化不同. (6认同)
  • "这是第一次在代码中引用时发生的"---不正确,实现可以自由决定何时加载类.当必须加载时,引用该类只是_deadline_. (3认同)

str*_*yba 7

是的,你是对的,因为你没有使用StaticClass它,它没有被vm加载,因此init()永远不会被执行.

对于第二个问题,您可能必须采取艰难的方式并扫描所有可用的类并加载它们.

/sf/answers/225611361/


mic*_*alk 5

首先,类加载不同于类初始化。对于从 Java 语言规范中寻找解释的任何人,静态块何时执行 - 在这里。

JLS§8.7说:

类中声明的静态初始值设定项在类初始化时执行(第 12.4.2 节)。

那么初始化是什么意思呢?让我们参考JLS §12.4.2。这描述了详细的初始化过程。然而,JLS §12.4.1点在这里可能更合适。它说:

类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:
  • T 是一个类,并且创建了一个 T 的实例。
  • T 是一个类,并且调用了一个由 T 声明的静态方法。
  • 分配了由 T 声明的静态字段。
  • 使用 T 声明的静态字段,该字段不是常量变量(第 4.12.4 节)。
  • T 是顶级类(第 7.6 节),并且执行在词法上嵌套在 T(第 8.1.3 节)中的 assert 语句(第 14.10 节)。
  • 因此,要使静态初始化程序块自动执行,您必须强制执行这些选项之一。