四川省城乡和住房建设厅网站首页,通过邮箱查注册网站,网站摸板,守游网络游戏推广平台文章目录 类加载机制打破打破双亲委派机制例子1例子2 类加载机制
类加载机制
打破打破双亲委派机制
例子1
JDBC的加载机制 Driver 接口是在rt.jar 包里定义的
public interface Driver {Connection connect(String url, java.util.Properties info)throws SQLException;
}… 文章目录 类加载机制打破打破双亲委派机制例子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;}