什么时候执行该类的静态块?

我有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尚未加载StaticClass,谁能告诉我


我的结论正确吗?

是什么触发了jvm加载类?

如何获得自动执行的静态块?

谢谢


炎炎设计
浏览 403回答 3
3回答

慕的地8271018

是的,你是对的。当JVM(具体来说是类加载器)加载时StaticClass(在第一次在代码中引用它时),将运行静态初始化块。您可以通过显式调用来强制调用此方法,StaticClass.init()这比依赖JVM更可取。您也可以尝试使用Class.forName(String)强制JVM加载类并调用其静态块。

红糖糍粑

首先,类加载不同于类初始化。对于从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中的断言(第14.10节)(第8.1.3节)。因此,要使静态初始化程序块自动执行,必须强制执行这些选项之一。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java