类加载机制-打破双亲委派机制

发布时间 2023-04-02 18:55:15作者: 蒹葭苍苍呀

 

1. 什么是双亲委派机制

双亲委派机制是Java类加载器的一种工作机制,它的主要思想是:如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成。如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,直到委托到最顶层的启动类加载器为止。如果父类加载器可以完成类加载任务,就成功返回;只有当父类加载器无法完成此加载任务时,子加载器才会尝试自己去加载。

 

2. 为什么要打破 双亲委派机制

打破双亲委派机制的目的是为了类加载隔离。因为在某些情况下父类加载器需要委托子类加载器去加载class文件。受到加载范围的限制,父类加载器无法加载到需要的文件,以Driver接口为例,由于Driver接口定义在jdk当中的,而其实现由各个数据库的服务商来提供,比如mysql。如果使用双亲委派机制,则由于父类无法找到mysql驱动程序,就会抛出ClassNotFoundException异常。

 

3. 打破 双亲委派机制的实际应用有哪些

打破双亲委派机制的应用场景有很多,

比如Tomcat自定义的类加载器WebAppClassLoader打破了双亲委托机制,它首先自己尝试去加载某个类,如果找不到再代理给父类加载器,其目的是优先加载Web应用自己定义的类。具体实现就是重写ClassLoader的两个方法:findClass和loadClass

除此之外,还有JDBC、JNDI等场景也需要打破双亲委派机制。

除此之外,还有Java中的SPI机制,它可以打破双亲委派机制。SPI的全名为Service Provider Interface,主要是应用于厂商自定义组件或插件中,在java.util.ServiceLoader的文档里有比较详细的介绍

 

 

4. 如何打破 双亲委派机制

 

破坏双亲委派有两种方式:

一种是通过重写 loadClass 方法来实现,

另一种是通过创建自定义的 ClassLoader 来实现。

但是,破坏双亲委派机制可能会导致类的重复加载,从而导致类的冲突和错误。

因此,我们应该尽量避免破坏双亲委派机制。