发布日期:2025-05-24 02:04点击次数:104
结合类加载器的自底向上的委托关系总结:
假设一个类处于 ClassPath 下,版本是 JDK8,默认使用应用类加载器进行加载。
1)当应用类加载器收到了类加载的请求,会把这个请求委派给它的父类(扩展类)加载器去完成。
2)扩展类加载器收到类加载的请求,会把这个请求委派给它的父类(引导类)加载器去完成。
3)引导类加载器收到类加载的请求,查找下自己的特定库是否能加载该类,即在 rt.jar、tools.jar... 包中的类。发现不能呀!返回给扩展类加载器结果。
4)扩展类加载器收到返回结果,查找下自己的扩展目录下是否能加载该类,发现不能啊!返回给应用类加载器结果。
5)应用类加载器收到结果,额!都没有加载成功,那只能自己加载这个类了,发现在 ClassPath 中找到了,加载成功。
你对并发很感兴趣,自己创建了个跟 JDK 一样的全限定名类 LongAdder, java.util.concurrent.atomic.LongAdder,然后程序启动交给类加载器去加载,能成功吗?
当然不能!这个 LongAdder 是 Doug Lea 大神写的,贡献到 JDK 并发包下的,并且被安排在 rt.jar 包中了,因此是由 Bootstrap ClassLoader 类加载器优先加载的,别人谁写同样的类,那就是故意跟 JDK 作对,是绝对不容许的。
即使你写了同样的类,编译可以通过,但是永远不会被加载运行,被 JDK 直接忽略掉。