什么时候执行一个类的静态块?
我有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加载,谁能告诉我
- 我的结论是正确的吗?
- 什么触发jvm加载类?
- 我怎样才能得到静态块自动执行?
谢谢
你是对的。 当JVM(类加载器 – 具体)加载StaticClass
(在代码中第一次引用时)时,会运行静态初始化块。
您可以通过显式调用StaticClass.init()
来强制调用此方法,这比依赖于JVM更好。
您也可以尝试使用Class.forName(String)
来强制JVM加载类并调用其静态块。
是的你是对的,因为你没有使用你的StaticClass
它不会被vm加载,因此init()
永远不会被执行。
对于你的第二个问题,你可能不得不艰难地扫描所有可用的类并加载它们。
你是对的,最简单的方法就是访问这个类,比如做一个
StaticClass.class.newInstance();
或者在你的主要方法方面的东西。 这将确保类由类加载器加载。
静态代码是在您的类( StaticClass
I guess)被引用时执行的。
因此,如果您创build一个StaticClass
的新实例 ,或者您调用其静态方法之一 ,则应该执行它 。
是的,静态初始化器将在类加载时执行。 这通常发生在您首次访问类加载上下文中的类时。
当加载的类被初始化或引用时,将执行静态块。 加载类不意味着类是初始化的。 JVM类加载是单独关注的事情。
在b.jar main方法中,类应该扩展那个StaticClass,然后自动调用那个静态块和init()
再添加一些:
静态块将在jvm加载类时执行。
在你的例子中你可以调用你的StaticClass
的init()
方法
像StaticClass staticClass = new StaticClass();
要么
StaticClass.class.newInstance();
这是比较优先的