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