Java 类加载器:定义加载器和启动加载器之间的区别?

Wua*_*ner 0 java classloader

JVMS

类加载器 L 可以通过直接定义 C 或委托给另一个类加载器来创建 C。如果 L 直接创建 C,我们说 L 定义了 C,或者等价地,L 是C的定义加载器

当一个类加载器委托给另一个类加载器时,发起加载的加载器不一定是完成加载并定义类的加载器。如果 L 通过直接定义或委托创建 C,我们说 L 启动 C 的加载,或者等价地,L 是C的启动加载器

我对这些有点困惑。

假设我们有两个类加载器:L 和 L p,并且 L p是L的父级。

如果C被在L和用L成功创建,则L是两个限定装载机启动加载器的C,是正确的吗?

如果 C 在 L 中定义但由 L p创建,我猜 L p正在启动C 的加载程序
但是 C 的定义 loader 是什么?因为 C 是在 L 中定义的,但不是由它直接创建的?这是个问题。

感谢所有回复。

小智 6

类加载器通常遵循委托机制。

假设代表团层次是L->Lp->Lq和类中定义Lp
在这种情况下,
L将委托类加载到Lp
Lp将委托给Lq
Lq不会加载类和调用返回到Lp
Lp将加载该类,因为它是在 中定义的Lp并且调用返回到L.

这里LpL是启动类加载器,Lp是定义类加载器。

类似地,如果委托层次结构是L->Lp并且类在 中定义L,则
L成为定义和启动类加载器。
Lp不是启动类加载器。

简单地说,如果类加载器能够返回对委托链中Class实例的引用,它就是一个初始化类加载器。