为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2019-11-30 13:26:14
我有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加载类?如何获得自动执行的静态块?谢谢
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

是的,你是对的。当JVM(具体来说是类加载器)加载时StaticClass(在第一次在代码中引用它时),将运行静态初始化块。

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

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


查看完整回答
反对 回复 2019-11-30
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

首先,类加载不同于类初始化。对于从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节)。

因此,要使静态初始化程序块自动执行,必须强制执行这些选项之一。


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 402 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信