1、安全性
双亲委派模型确保了Java核心类库的类型安全。因为所有的类加载请求最终都会传递给顶层的启动类加载器(Bootstrap ClassLoader),它负责加载Java的核心类库。这意味着任何自定义的类加载器都不可能加载一个与Java核心类库中的类同名的类,从而避免了潜在的安全隐患,如恶意替换核心类。
2、避免类重复加载
通过双亲委派模型,每个类加载器在尝试加载类之前,都会先请求其父类加载器加载该类。如果父类加载器已经加载过该类,则直接返回已加载的类,避免了重复加载。这有助于减少内存消耗和提高类加载的效率。
3、简化类加载器实现
在双亲委派模型下,子类加载器只需实现findClass()方法(或者继承URLClassLoader),而无需重写loadClass()方法。这是因为loadClass()方法已经实现了双亲委派模型的逻辑,子类加载器只需在父类加载器无法加载类时,再尝试自己加载。这大大简化了类加载器的实现。
4、维护Java的扩展性
Java提供了三种类加载器:启动类加载器、扩展类加载器和系统类加载器。通过双亲委派模型,这些类加载器可以协同工作,形成一个有层次的类加载器结构。这使得Java可以方便地扩展其类库,只需将新的类库添加到扩展目录中,或者通过自定义类加载器来加载新的类库。
5、提供灵活的类加载策略
虽然双亲委派模型是Java默认的类加载策略,但并不意味着它不能被打破。在某些特殊场景下,可能需要自定义类加载器来打破双亲委派模型,以实现更灵活的类加载策略。例如,在OSGi(Open Service Gateway initiative)中,就使用了自定义的类加载器来支持模块的动态加载和卸载。