首页 > 解决方案 > java中class.forName方法的布尔初始化参数

问题描述

尽管我阅读了文档,但在加载类时,我无法理解这两行 java 代码之间的区别:

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


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

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

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

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

标签: javaclassloaderdynamic-class-loaders

解决方案


正如 JLS 的引用章节所述:

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

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

在一个类被初始化之前,它的直接超类必须被初始化,但该类实现的接口没有被初始化。类似地,接口的超接口在接口初始化之前不会被初始化。

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

从这个类创建一个对象是 JVM 将自行初始化该类的最新点,如果在此之前这被跳过的话。


推荐阅读