双亲委派模型(Parent-Delegation Model)是Java类加载机制中的一种设计思想和执行策略。根据该模型,当一个类加载器接收到加载类的请求时,它首先将这个请求委派给父加载器来完成加载工作,只有当父加载器无法加载该类时,才会自己尝试加载。
双亲委派模型的定义如下:
1. 每个类加载器在尝试加载类之前,都会先请求它的父加载器加载该类。
2. 如果父加载器可以加载该类(即父加载器的搜索范围包含该类),则将加载结果返回给子加载器,子加载器无需再进行加载。
3. 如果父加载器无法加载该类,则子加载器才会尝试自己加载。
这种委派机制保证了类加载的有序性和层次性,具体表现为以下几点优势:
1. 避免重复加载:通过委派给父加载器,避免了同样的类被重复加载,保证了类的唯一性。
2. 安全性保障:双亲委派模型可以防止恶意类的加载和替换,通过父加载器的加载机制,使得核心类库由JVM自身加载,避免了被替换的风险。
3. 类隔离性:每个类加载器都有自己的命名空间,加载的类只在自己所在的命名空间内可见,即实现了类的隔离性。
在Java中,JVM内置了三个类加载器,它们之间形成了一个层次结构:启动类加载器(Bootstrap Class Loader)是位于最顶层的类加载器,负责加载JVM核心类;扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)位于中间层,负责加载用户编写的类和扩展类库。这些加载器按照双亲委派模型依次向上委派加载类,形成了类加载的层次结构。
通过双亲委派模型和类加载器的层次结构,Java程序可以实现类的动态加载、隔离加载环境和避免类冲突等需求。