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

时间:2016-09-02 03:50:30

标签: java classloader

来自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中定义但不是由它直接创建的?这是一个问题。

感谢所有回复。

1 个答案:

答案 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

此处LLp是启动类加载器,L是定义类加载器。

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

简而言之,如果类加载器能够返回对委托链中 Class 实例的引用,那么它就是一个启动类加载器。