来自JVMS:
类加载器L可以通过直接定义或通过委托来创建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&#39> 定义加载器?既然C在L中定义但不是由它直接创建的?这是一个问题。
感谢所有回复。
答案 0 :(得分:3)
类加载器通常遵循委托机制。
假设委托层次结构为<receiver android:name=".ApkInstalledReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
,并且类在L->Lp->Lq
中定义
在这种情况下,
Lp
会将课程加载委托给L
,
Lp
将委托给Lp
Lq
将不会加载该类,并且调用将返回Lq
。
Lp
将加载该类,因为它已在Lp
中定义,并且该调用将返回Lp
。
此处L
和Lp
是启动类加载器,L
是定义类加载器。
同样,如果委托层次为Lp
并且类在L->Lp
中定义,则L
成为定义和启动类加载器。
L
不是启动类加载器。
简而言之,如果类加载器能够返回对委托链中 Class 实例的引用,那么它就是一个启动类加载器。