委托模型在类加载器中的作用

时间:2018-01-17 11:26:29

标签: java jvm classloader

我一直在阅读类加载器概念,我不清楚为什么使用委托模型?任何人都可以帮助我理解为什么请求来自应用程序类加载器 - >扩展类加载器 - > bootstrap类加载器然后从上到下搜索类? 为什么不能直接请求引导类加载器然后扩展类加载器然后应用程序类加载器?任何人都可以用简单易懂的解释来解释吗?

1 个答案:

答案 0 :(得分:1)

ClassLoader X 委托给其父加载程序 P 时,如果 P ,它将尝试在本地解析该类没有找到该类,但这并不意味着始终存在从 P X 的委托。

只有当您向 X 询问某个课程时,您才可以获得由 X 或其父 P 定义的课程,优先考虑<如果 X 遵循标准委托模型,则em> P 。如果您直接询问 P ,您将只获得 P (或 P 的父母)定义的课程,而不是来自 X 。同样,当你问另一个类加载器 Y ,它也有父加载器 P 时,你可能会得到由 Y 定义的类。 P 但不是 X

在预定义加载器的特定示例中,引导加载程序将永远不会询问任何其他类加载器,这在解析引导加载程序加载的类的依赖关系时至关重要。引导类的这些依赖关系无法解析为应用程序类。类似地,扩展类加载器加载的类的依赖关系可以解析为引导类或扩展类,而不是应用程序类。

创建其他类加载器时,可以通过选择正确的父加载器来确定其范围内的类。例如,当新加载器的父级是扩展类加载器时,应用程序类不在其范围内。

请注意,此标准父委派是一个约定,换句话说,仍然是一个并非所有ClassLoader实现都遵循的实现细节。因此,要求特定的类加载器加载一个类,是获取特定类加载器行为的唯一方法。此时,从那里调用父加载器并返回调用者是实现标准委派的最简单方法。