Java类链接解析步骤或初始化是否会导致加载其他解析类?
我正在阅读JVM规范文档和JLS,关于java中的类加载机制 以下是我的理解Java类链接解析步骤或初始化是否会导致加载其他解析类?,java,jvm,classloader,Java,Jvm,Classloader,我正在阅读JVM规范文档和JLS,关于java中的类加载机制 以下是我的理解 首先,当要求加载主类时,它 查看类的二进制表示形式是否已被删除 是否已加载,如果未加载,则类加载程序将从中加载类文件 磁盘 联系步骤:核查、准备和解决 初始化 我发现令人困惑的是,在解析和初始化步骤中,如果引用了一个尚未从源代码加载的类,会发生什么?解析或初始化步骤是否暂停,以便由其父类加载器加载类 或者加载、链接和初始化是否延迟到运行时执行使用该引用的实际方法或代码时?说明: 链接一个类或接口需要验证和准备该类或接
java.lang.Object
,则跳过此步骤,也就是说,任务始终有效。因此,某些类型可能只有在第一次实际使用时才能得到解析,例如,当通过new
实例化它们时,或者调用该类型声明的静态
方法时。但这取决于代码的微妙方面。另见或
可能存在仅在反射数据(如注释或调试属性)中引用的类型,这些类型在运行期间从未解析,但可能在另一个运行中
但由于这意味着类型的解析延迟到实际需要时,因此也意味着此时操作将停止并等待先决条件类的此过程完成。因此,例如,加载一个类总是意味着解析它的直接超类,如果尚未加载则加载它,这反过来意味着解析该超类的超类,等等。因此,在解决完整的超类层次结构之前,它不会返回。JVM也在第5.3节中说明 如果Java虚拟机在验证期间尝试加载C类 (§5.4.1)或决议(§5.4.3)(但不包括初始化(§5.5)),以及类加载器 用于启动C加载的,抛出ClassNotFoundException实例, 然后Java虚拟机必须抛出NoClassDefFoundError的实例 其原因是ClassNotFoundException的实例。 (这里的一个微妙之处是执行递归类加载以加载超类 作为决议的一部分(§5.3.5,步骤3)。因此,ClassNotFoundException 类加载器未能加载超类的结果必须包装在 NoClassDefFoundError。) 因此,在类加载的解析阶段确实存在递归