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

发布于:2024-06-26 ⋅ 阅读:(152) ⋅ 点赞:(0)

类加载机制

类加载机制

打破打破双亲委派机制

例子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已加载。

@Override
    protected Class<?> loadClassWithoutExceptionHandling(String name, boolean resolve)
            throws ClassNotFoundException {

        // First, check if the class has already been loaded
        Class<?> c = findLoadedClass(name);

        if (c == null) {
            // check whether the class should go parent-first
            for (String alwaysParentFirstPattern : alwaysParentFirstPatterns) {
                if (name.startsWith(alwaysParentFirstPattern)) {
                    return super.loadClassWithoutExceptionHandling(name, resolve);
                }
            }

            try {
                // check the URLs
                c = findClass(name);
            } catch (ClassNotFoundException e) {
                // let URLClassLoader do it, which will eventually call the parent
                c = super.loadClassWithoutExceptionHandling(name, resolve);
            }
        } else if (resolve) {
            resolveClass(c);
        }

        return c;
    }


网站公告

今日签到

点亮在社区的每一天
去签到