首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候执行类的静态块?

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

Stack Overflow用户
提问于 2012-02-03 14:45:01
回答 9查看 63.5K关注 0票数 77

我有两个罐子,我们叫它们a.jar和b.jar。

b.jar依赖于a.jar。

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

代码语言:javascript
复制
public class StaticClass {
  static {
    init();
  } 

  public void static init () {
    // do some initialization here
  }
}

在b.jar中,我有一个main,所以在主体中,我希望init()方法已经被调用了,但实际上没有。我怀疑这是因为jvm没有加载StaticClass,有人能告诉我吗?

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

谢谢

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-02-03 14:52:15

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

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

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

票数 95
EN

Stack Overflow用户

发布于 2012-02-03 14:51:25

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

对于你的第二个问题,你可能必须努力,扫描所有可用的类并加载它们。

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

票数 7
EN

Stack Overflow用户

发布于 2019-07-19 04:12:09

首先,类加载不同于类初始化。对于任何想要从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)中以词汇方式嵌套的断言语句(§14.10)。

因此,要使静态初始化程序块自动执行,您必须强制执行其中一个选项。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9130461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档