java中class.forName方法的布尔初始化参数

Ahm*_*ğlu 2 java classloader dynamic-class-loaders

虽然我阅读了文档,但我无法理解加载类时这两行 java codee 之间的区别:

Class<?> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror", false, enginClassLoader);


Class<?> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror", true, enginClassLoader);
Run Code Online (Sandbox Code Playgroud)

这里的布尔参数在文档中解释如下:

initialize 如果为真,类将被初始化。请参阅 Java 语言规范的第 12.4 节。

就我而言,即使我使用带有 false 参数的代码,它仍然有效。所以我想知道什么时候应该是真的?

Nic*_*tar 8

正如 JLS 的参考章节所述:

类的初始化包括执行其静态初始化程序和类中声明的静态字段(类变量)的初始化程序。

接口的初始化包括执行接口中声明的字段(常量)的初始化程序。

一个类在初始化之前,必须先对其直接超类进行初始化,但该类实现的接口没有被初始化。同样,在接口初始化之前,接口的超接口也不会被初始化。

因此,第一个调用不会为字段和常量运行任何静态初始化程序,例如 private static String x = "this is my value";将 x 留空并稍后进行初始化,而第二个调用会将 x 设置为所需的值。

从这个类创建一个对象是 JVM 自己初始化这个类的最后一点,如果在这之前跳过了这个。

  • 实际上,“private String x”不会受到影响,因为它是一个实例字段。然而,“private static String x”将会受到影响。此外,永远不会有“x”被视为 null 的情况,因为读取“x”需要初始化该类。 (2认同)