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

我有2个jar子,让我们叫他们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,我有一个主,所以在主要的,我期望的init()方法已被调用,但实际上不是。 我怀疑是因为StaticClass没有被jvm加载,谁能告诉我

  1. 我的结论是正确的吗?
  2. 什么触发jvm加载类?
  3. 我怎样才能得到静态块自动执行?

谢谢

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

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

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

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

对于你的第二个问题,你可能不得不艰难地扫描所有可用的类并加载它们。

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

你是对的,最简单的方法就是访问这个类,比如做一个

StaticClass.class.newInstance();

或者在你的主要方法方面的东西。 这将确保类由类加载器加载。

静态代码是在您的类( StaticClass I guess)被引用时执行的。

因此,如果您创build一个StaticClass新实例 ,或者您调用其静态方法之一 ,则应该执行

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

当加载的类被初始化或引用时,将执行静态块。 加载类不意味着类是初始化的。 JVM类加载是单独关注的事情。

在b.jar main方法中,类应该扩展那个StaticClass,然后自动调用那个静态块和init()

再添加一些:

静态块将在jvm加载类时执行。

在你的例子中你可以调用你的StaticClassinit()方法

像StaticClass staticClass = new StaticClass();

要么

StaticClass.class.newInstance(); 这是比较优先的