本文主要是介绍类加载机制-打破双亲委派机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 类加载机制
- 打破打破双亲委派机制
- 例子1
- 例子2
类加载机制
类加载机制
打破打破双亲委派机制
例子1
JDBC的加载机制
Driver 接口是在rt.jar 包里定义的
public interface Driver {Connection connect(String url, java.util.Properties info)throws SQLException;
}
实现类是在mysql-connector-xx jar 里实现的
package com.mysql.cj.jdbc;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
}
从类加载机制来分析
对于driver 的实现类,应该是由BootstrapClassLoader来加载,但是BootstrapClassLoader 只能加载rt.jar里的类,它的实现类是在mysql-connector-xx jar里的,最后是直接通过app classloader 来加载的
这里面具体的原理和SPI有关,这里就打破了理论上的 双亲委派机制,没有把加载请求向上传递。
例子2
flink 里的child-first 加载机制
flink 的task-manager和jobmanager本身也是java 程序,为了能够使程序运行的时候,加载自己依赖的jar 包类,而不和本身程序依赖的类,冲突。特意重写了类加载器,对于一些公共类比如java./org.apache.flink./ 这些类向上传递加载请求,其它的类直接从本身依赖的JAR已加载。
@Overrideprotected Class<?> loadClassWithoutExceptionHandling(String name, boolean resolve)throws ClassNotFoundException {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {// check whether the class should go parent-firstfor (String alwaysParentFirstPattern : alwaysParentFirstPatterns) {if (name.startsWith(alwaysParentFirstPattern)) {return super.loadClassWithoutExceptionHandling(name, resolve);}}try {// check the URLsc = findClass(name);} catch (ClassNotFoundException e) {// let URLClassLoader do it, which will eventually call the parentc = super.loadClassWithoutExceptionHandling(name, resolve);}} else if (resolve) {resolveClass(c);}return c;}
这篇关于类加载机制-打破双亲委派机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!