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 来实现。
但是,破坏双亲委派机制可能会导致类的重复加载,从而导致类的冲突和错误。
因此,我们应该尽量避免破坏双亲委派机制。
标签:委派,打破,双亲,机制,父类,加载 From: https://www.cnblogs.com/shoshana-kong/p/17281018.html