目录
- 1. 说明
- 2. 类加载器层次结构
- 3. 工作原理
- 4. 主要作用
- 5. 局限性
- 6. 破坏双亲委派机制
1. 说明
- 1.双亲委派机制(Parent Delegation Model)是Java类加载器的一种工作模式,它确保了类加载的一致性和安全性。
- 2.双亲委派机制的基本思想是:当一个类加载器试图加载某个类时,它会先委托给其父类加载器,如果父类加载器无法加载,再由当前类加载器自己进行加载。
- 3.这种层层委派的方式有助于保障类的唯一性,避免类的重复加载,并提高系统的安全性和稳定性。
2. 类加载器层次结构
- 1.启动类加载器(Bootstrap Class Loader):负责加载Java的核心库,如java.lang.*等。它是最顶层的类加载器,通常由C++编写,不存在父类加载器。
- 2.扩展类加载器(Extension Class Loader):负责加载Java的扩展库,一般位于<JAVA_HOME>/lib/ext目录下。它的父类加载器是启动类加载器(在实际逻辑中)。
- 3.应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序类路径上指定的类库。它的父类加载器是扩展类加载器。
3. 工作原理
- 1.检查缓存:类加载器首先检查是否已经加载过该类,如果已经加载过,则直接返回该类。
- 2.委派父加载器:如果没有加载过该类,类加载器将加载请求委派给父类加载器。
- 3.递归过程:父类加载器也按照相同的过程处理加载请求,直到委派到启动类加载器。
- 4.启动类加载器加载:启动类加载器尝试加载类,如果加载成功,则返回该类。
- 5.逐级回退:如果启动类加载器无法加载该类,加载请求逐级回退到下一级类加载器,直至回退到最初的请求者。
- 6.自行加载:最终,如果所有父类加载器都无法加载该类,子类加载器才会尝试自行加载。
4. 主要作用
- 1.保证类加载的安全性:由于双亲委派机制中,顶层的类加载器(如Bootstrap ClassLoader)负责加载核心类库,这种设计可以避免恶意代码替换核心类库,从而确保核心类库的完整性和安全性。
- 2.避免重复加载:通过双亲委派机制,如果一个类已经被一个类加载器加载过,那么其他的类加载器就无需再次尝试加载,这样可以避免同一个类被多次加载的情况,节省内存并提高性能。
- 3.保证类的一致性:双亲委派机制确保了同一个类在整个Java应用中只有一个唯一的定义,避免了同名类不同实现的冲突问题。
5. 局限性
- 1.灵活性不足:双亲委派机制的严格层级关系使得子类加载器很难绕过父类加载器直接加载类,这在某些情况下限制了灵活性。
- 2.复杂性:实现自定义类加载器时,需要理解和实现双亲委派机制,这增加了开发的复杂性。
6. 破坏双亲委派机制
- 1.在某些特定需求下,可能需要破坏双亲委派机制,如加载自定义的类或版本不同的类库。
- 2.这通常通过继承ClassLoader并覆盖loadClass方法或findClass方法来实现。
- 3.破坏双亲委派机制可能会带来安全风险,因此需要谨慎操作。