何时执行类的静态块?

我有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
  }
}

在b.jar中,我有一个main,所以在main中,我希望init()方法已被调用,但实际上没有。我怀疑这是因为静态类没有被jvm加载,谁能告诉我

  1. 我的结论是正确的吗?
  2. 是什么触发 jvm 来装入类?
  3. 如何自动执行静态块?

谢谢


答案 1

是的,你是对的。静态初始化块在 JVM(类装入器 - 具体而言)加载时运行(在代码中首次引用它时发生)。StaticClass

您可以通过显式调用来强制调用此方法,这比依赖 JVM 更可取。StaticClass.init()

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


答案 2

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

对于第二个问题,您可能必须走一条艰难的道路,扫描所有可用的类并加载它们。

https://stackoverflow.com/a/3223019/393657