Java ClassLoader委托模型的好处?

时间:2014-07-21 04:16:41

标签: java

我知道ClassLoader首先检查该类是否已加载,如果没有,则立即将此检查委托给其父ClassLoader.But,最后所有类都由Bootstrap加载。为什么我们要委托我们实现的目标是什么?

2 个答案:

答案 0 :(得分:3)

实现不必总是委托父类加载器。这取决于要求。如果需要需要类加载器实现加载类,它可以加载它,即使它已经被另一个类加载器加载了。

由ClassLoader_1加载的类(和实例)将不会被另一个ClassLoader_2加载的实例访问。这提供了额外的安全性。

例如,在浏览器中,每个域都可以被赋予自己独特的类加载器(通过浏览器实现)。核心java类可以委托给Boot Class加载器来优化核心类,因为它们不会有所不同。所有这些类加载器都可以加载到单个JVM中,以便最佳地使用资源。

现在,一个域的实例/类将无法访问由另一个类加载器加载的其他域的实例。如果他们访问跨站点,他们将收到ClassCastException。

层次结构可确保父级加载的类与子级兼容

您可以使用以下

从执行线程访问当前上下文类加载器
Thread.getContextClassLoader();

您可以使用以下

访问加载对象的类加载器
Object o = ....
o.getClass().getClassLoader();

答案 1 :(得分:1)

通过可选委托给另一个类加载器,类加载器实现了Decorator设计模式。这样可以更轻松地向现有的类加载器添加功能。

替代方案是应用程序员实现的任何类加载器都必须实现 all 类加载逻辑。由于必须小心地完成类加载以避免安全漏洞,应用程序员可能会引入许多安全问题。