我知道ClassLoader首先检查该类是否已加载,如果没有,则立即将此检查委托给其父ClassLoader.But,最后所有类都由Bootstrap加载。为什么我们要委托我们实现的目标是什么?
答案 0 :(得分:3)
实现不必总是委托父类加载器。这取决于要求。如果需要需要类加载器实现加载类,它可以加载它,即使它已经被另一个类加载器加载了。
由ClassLoader_1加载的类(和实例)将不会被另一个ClassLoader_2加载的实例访问。这提供了额外的安全性。
例如,在浏览器中,每个域都可以被赋予自己独特的类加载器(通过浏览器实现)。核心java类可以委托给Boot Class加载器来优化核心类,因为它们不会有所不同。所有这些类加载器都可以加载到单个JVM中,以便最佳地使用资源。
现在,一个域的实例/类将无法访问由另一个类加载器加载的其他域的实例。如果他们访问跨站点,他们将收到ClassCastException。
层次结构可确保父级加载的类与子级兼容
您可以使用以下
从执行线程访问当前上下文类加载器Thread.getContextClassLoader();
您可以使用以下
访问加载对象的类加载器Object o = ....
o.getClass().getClassLoader();
答案 1 :(得分:1)
通过可选委托给另一个类加载器,类加载器实现了Decorator设计模式。这样可以更轻松地向现有的类加载器添加功能。
替代方案是应用程序员实现的任何类加载器都必须实现 all 类加载逻辑。由于必须小心地完成类加载以避免安全漏洞,应用程序员可能会引入许多安全问题。