Java面试必考点:深入解析“破坏双亲委派”

一、引言
在Java面试中,有一个经常被问及的Java核心问题,那就是“破坏双亲委派”。很多人对这个概念感到困惑,不清楚其原理、作用以及在实际开发中的应用。本文将从多个角度深入剖析“破坏双亲委派”,帮助读者全面了解这一关键知识点。
二、双亲委派模型概述
在Java中,类加载器负责将类的.class文件转换成Class对象。在Java虚拟机中,存在两种类型的类加载器:启动类加载器和用户自定义类加载器。双亲委派模型是指当一个类加载器在收到一个类的加载请求时,会先将这个请求委派给其父类加载器,只有当父类加载器无法完成这个请求时,才会由自己来处理。
这种模型的优点在于确保了Java程序的安全稳定运行,防止了诸如恶意代码的破坏。例如,假设有一个名为“java.lang.String”的类,启动类加载器会将它加载到JVM中,而用户自定义类加载器无法加载这个类。此时,如果用户尝试加载一个名为“java.lang.String”的恶意类,双亲委派模型会阻止其加载,从而避免了恶意代码对Java核心库的破坏。
三、破坏双亲委派的原因
1. 解决某些框架或库在运行时需要修改类加载器路径的问题
在某些场景下,框架或库需要在运行时动态地加载类。如果使用双亲委派模型,就需要先加载核心类,然后再加载框架或库,这会导致加载过程变得复杂。因此,一些框架或库选择破坏双亲委派,实现自定义类加载器,以简化类加载过程。
2. 实现不同版本的核心库共存
在某些情况下,系统需要同时运行两个不同版本的Java应用。如果使用双亲委派模型,会导致一个版本的核心库覆盖另一个版本的库。为解决这一问题,一些应用会选择破坏双亲委派,以实现不同版本核心库的共存。
四、破坏双亲委派的方法
破坏双亲委派主要有以下几种方法:
1. 继承抽象类加载器
自定义类加载器可以继承抽象类加载器,如URLClassLoader,并重写findClass方法,实现自定义的类加载逻辑。
2. 自定义类加载器
自定义类加载器可以不继承任何类加载器,直接实现ClassLoading、resolve和findClass等方法。
3. 实现findClass方法
自定义类加载器可以通过实现findClass方法,直接从特定的目录加载类,绕过双亲委派。
五、破坏双亲委派的应用场景
1. CGLIB动态代理
CGLIB是一种基于动态代理的类库,它可以在运行时生成代理类。为实现这一功能,CGLIB需要破坏双亲委派,以加载代理类。
2. Hibernate
Hibernate是一个开源的对象关系映射框架。在Hibernate中,第二级缓存使用了自定义类加载器来加载缓存类,从而破坏了双亲委派。
六、总结
破坏双亲委派是一种技术手段,在特定场景下可以解决一些实际问题。然而,过度使用破坏双亲委派可能导致安全风险,因此需要谨慎使用。在Java面试中,了解破坏双亲委派的原理和应用场景,有助于提高自己的面试竞争力。希望本文对您有所帮助。






