我有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加载类并调用其静态块。
红糖糍粑
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节)。
因此,要使静态初始化程序块自动执行,必须强制执行这些选项之一。
添加回答
举报
0/150
提交
取消