Java的双亲委派机制是一种类加载器间的协作模式,用于确保Java应用程序中类的唯一性、安全性和正确性。这种机制规定了类加载器在加载某个类时的行为规范,其核心思想是:当一个类加载器接收到类加载请求时,首先将加载任务委托给其父类加载器去完成;只有当父类加载器无法完成加载(如找不到对应类)时,子类加载器才尝试自己去加载。
1.具体运作过程:
类加载请求:当程序首次使用某个类时,如果该类尚未被加载到JVM中,那么会触发类加载请求。
初始委派:当前接到加载请求的类加载器(称为“发起加载器”)首先将加载任务委托给其上级(父)类加载器。这种委托关系一直延续到最顶层的类加载器,通常是Bootstrap ClassLoader(引导类加载器)。Bootstrap ClassLoader负责加载Java核心库(如rt.jar),它没有父加载器。
父加载器尝试加载:从最顶层的类加载器开始,按照层次逐级向下尝试加载类。每个父加载器在接收到请求后,会检查是否已经加载过该类,如果有则直接返回已加载的类;否则,尝试从其定义的类搜索路径(如CLASSPATH、-Xbootclasspath指定的路径等)中查找并加载类的字节码文件。
子加载器加载:如果所有父加载器均无法完成加载(即未找到对应类或拒绝加载),则最初的发起加载器(即子类加载器)开始尝试自己加载类。它会在其定义的类搜索路径中查找并加载类的字节码文件。
加载成功与缓存:无论在哪一级加载器成功加载了类,都会将加载结果记录在内部缓存中,以便后续请求可以直接返回,避免重复加载。同时,该类会被关联到加载它的类加载器实例,确保类的唯一性。
加载失败处理:如果所有加载器都无法成功加载类,将会抛出ClassNotFoundException。
2.双亲委派机制带来的好处包括:
防止类重复加载:由于类加载请求总是先向上委托,所以父加载器已经加载过的类,其子加载器就不会再尝试加载,确保了类的全局唯一性。
保障核心类库安全:系统类库由引导类加载器加载,由于其没有父加载器,因此用户自定义类加载器无法加载覆盖核心类库中的类,防止恶意代码篡改或替换核心类库。
实现类加载器隔离:不同类加载器加载的类互相不可见,除非显式允许。这种隔离机制有利于实现模块化、插件化系统,每个模块或插件有自己的类加载器,它们之间互不影响。
提供统一的类加载入口:通过委派机制,所有类的加载请求最终都会到达顶层的引导类加载器,保证了对系统类库加载的统一控制。