双亲委派机制(Parent Delegation Model)是 Java 类加载器(ClassLoader)机制中的一种重要原则,用于保证 Java 类的唯一性和安全性。以下是关于双亲委派机制的详细解释:
原理:
在 Java 中,类加载器之间形成了一种层级关系,通常分为启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)等。
双亲委派机制规定,当一个类加载器收到加载类的请求时,它会先委托给其父类加载器去尝试加载该类,只有在父类加载器无法加载时,才会自己尝试加载。
优势:
避免类的重复加载:通过双亲委派机制,可以确保同一个类在 JVM 中只被加载一次,避免类的重复加载。
安全性:双亲委派机制可以防止恶意代码替换核心 API 类,提高了系统的安全性。
工作流程:
当一个类加载器收到加载类的请求时,首先会检查该类是否已经被加载过,如果是,则直接返回已加载的类。
如果该类尚未加载,类加载器会将加载请求委托给其父类加载器。
父类加载器会依次向上委派,直到达到启动类加载器,如果启动类加载器仍无法加载该类,则会由最底层的类加载器尝试加载。
避免类的重复加载:
当一个类需要被加载时,首先会由最顶层的启动类加载器尝试加载。如果启动类加载器无法找到该类,会委托给扩展类加载器,然后依次向下委派,直到应用类加载器。
如果应用类加载器也无法加载该类,它会尝试从自己的类路径中加载。如果该类已经被加载过,则直接返回已加载的类,避免重复加载。
类的唯一性:
通过双亲委派机制,同一个类在 JVM 中只会被加载一次。这确保了类的唯一性,避免了类的重复加载和可能导致的冲突。
当一个类被加载后,它会被缓存起来,下次再次加载该类时,会直接返回缓存的类,而不会重新加载。
性能和安全性:
避免类的重复加载不仅提高了系统的性能,还增强了系统的安全性。通过双亲委派机制,可以确保核心类库不会被恶意代码替换,提高了系统的稳定性和安全性。
启动类加载器(Bootstrap ClassLoader):
是 JVM 的一部分,负责加载 Java 核心类库(如 java.lang 包中的类)。
由 C++ 实现,不是 Java 类,通常在 JVM 启动时就已经加载。
扩展类加载器(Extension ClassLoader):
负责加载 Java 的扩展类库(如 java.ext.dirs 系统属性指定的目录中的类)。
是由 Java 实现的类加载器,通常是用来加载 JDK 扩展目录中的类。
应用类加载器(Application ClassLoader):
也称为系统类加载器,负责加载应用程序的类,包括应用程序的类路径中指定的类。
是大多数 Java 应用程序默认的类加载器,加载应用程序的类和第三方库的类。
自定义类加载器:
开发人员可以通过继承 ClassLoader 类来创建自定义类加载器,用于加载特定的类或实现特定的加载逻辑。
自定义类加载器可以根据需要实现不同的加载策略,如从网络、数据库或其他来源加载类。
每个类加载器都有其加载范围和加载策略,类加载器之间通过双亲委派机制形成了一种层级关系。当一个类需要被加载时,会由最顶层的启动类加载器开始尝试加载,然后依次向下委派,直到应用类加载器。这种机制确保了类的唯一性和安全性,避免了类的重复加载和可能的冲突。