【发布时间】:2020-01-15 02:58:00
【问题描述】:
根据this JVM specification,C 的类加载器由触发C 加载的D 确定:
Java 虚拟机使用三个过程之一来创建类 或者接口
C用N表示:
如果
N表示非数组类或接口,则两者之一 以下方法用于加载并由此创建C:
如果
D由引导类加载器定义,则引导 类加载器启动C的加载(第 5.3.1 节)。如果
D是由用户定义的类加载器定义的, 那么同样 用户定义的类加载器启动C的加载(第 5.3.2 节)。- ...
那么,基本情况呢?我的意思是,将加载第一个类,显然D 在这种情况下无法定义。
【问题讨论】:
-
这就是规范所指的引导类加载器
-
@ernest_k 我希望如此。但是,你能从规范中找出具体的措辞吗?
-
你的“基本情况”是什么?您是在询问在 JVM 中加载/创建的第一个类(大概是
java.lang.Object)还是关于应用程序类(包含main方法的类)? -
@Holger 嗯,我最初的意思是任何无法定义
D的情况。如果这两个案例属于同一情况,我对两者都感兴趣。 -
嗯,这是两种完全不同的情况。当 JVM 初始化自己时,它必须自己初始化类
Object、String、Class和ClassLoader(以及更多),因为 Java 端类加载取决于它们。此外,这些类具有循环依赖关系。因此,只有在以特定于实现的方式准备好这些类之后,它才能真正遵循正式的过程。另一方面,当一切准备就绪时,使用 system class loader 加载主类。
标签: java jvm language-lawyer