java - 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 节。
就我而言,即使我使用带有错误参数的代码,它仍然有效。所以我想知道什么时候它应该是真的?
解决方案
正如 JLS 的引用章节所述:
类的初始化包括执行其静态初始化程序和类中声明的静态字段(类变量)的初始化程序。
接口的初始化包括执行接口中声明的字段(常量)的初始化程序。
在一个类被初始化之前,它的直接超类必须被初始化,但该类实现的接口没有被初始化。类似地,接口的超接口在接口初始化之前不会被初始化。
因此,第一个调用不会为字段和常量运行任何静态初始化程序,例如 private static String x = "this is my value";
将 x 保留为空并稍后进行初始化,而第二个调用会将 x 设置为所需的值。
从这个类创建一个对象是 JVM 将自行初始化该类的最新点,如果在此之前这被跳过的话。
推荐阅读
- walmart-api - Walmart API 因某些搜索而损坏
- visual-studio - 无法设置执行策略以允许我在 Visual Studio 生成后事件中执行脚本
- javascript - HTML Javascript 使用 Slider bar 步骤更改图像
- javascript - 参考错误:PDFViewer 未定义
- node.js - 如何获取用户执行脚本的目录名/路径?
- javascript - 解析后从js代码中获取特定值
- twitter-bootstrap - Bootstrap (4.3.1) 的 RFS(响应式字体大小)未在 1200px 阈值处生成媒体查询
- python - 熊猫数据框分组并转置而不排序
- r - 如何从润滑脂中提取时间?
- typo3 - 语言从默认语言更改时无法获取内容