何时执行类的静态块?

时间:2012-02-03 14:45:02

标签: 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
  }
}

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

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

9 个答案:

答案 0 :(得分:86)

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

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

你是对的,最简单的方法是访问该类,例如做一个

StaticClass.class.newInstance();

或者主要方法中的某些方面。这将确保类由类加载器加载。

答案 3 :(得分:3)

当您的类(我猜是StaticClass)被引用时,将执行静态代码。

因此,如果您创建StaticClass新实例,或者调用其静态方法之一,则应执行此操作。

答案 4 :(得分:2)

在首次初始化或引用加载的类时执行静态块。加载类并不意味着要初始化类。 JVM类加载是值得关注的事情。

答案 5 :(得分:1)

是的,加载类时将执行静态初始化程序。这通常在您第一次在类加载上下文中访问类时发生。

答案 6 :(得分:1)

首先,类加载不同于类初始化。对于任何需要从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节)。
  • 因此,要使静态初始化程序块自动执行,必须强制执行这些选项之一。

    答案 7 :(得分:0)

    b.jar中的

    主方法类应该自动扩展StaticClass,然后自动调用静态块和init()

    答案 8 :(得分:0)

    再添加一些:

    当jvm加载类时,将执行

    静态块。

    在您的示例中,您可以通过实例化类

    来调用init()的{​​{1}}方法

    像     StaticClass staticClass = new StaticClass();

    StaticClass 这是更优先的