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

问题描述 投票:0回答:1

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

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


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

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

如果为true,则初始化,将初始化该类。参见第12.4节Java语言规范。

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

java classloader dynamic-class-loaders
1个回答
5
投票

正如JLS的引用章节所述:

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

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

在初始化类之前,其直接超类必须为已初始化,但类未实现的接口初始化。同样,接口的超级接口不是接口初始化之前已初始化。

因此,第一次调用将不会为字段和常量(如private static String x = "this is my value";)运行任何静态初始值设定项,而将x保留为null,稍后再进行初始化,第二次调用会将x设置为所需的值。

通过此类创建对象是JVM自行初始化该类的最新点(如果在此之前被跳过的话。)>

© www.soinside.com 2019 - 2024. All rights reserved.