JVM修炼之路【6】- 理解双亲委派机制(且如何破坏此机制)

上一篇博客中我们说了java中有多个类加载器,分别加载各自负责的类。但是这样出现一个问题,如果各自负责的类加载器中有重复的类?这时候怎么办? 让它被不同的类加载器加载多次?? 显然是不合理的


双亲委派机制的核心就是解决一个类到底由谁加载,且不会被重复加载。
双亲委派机制设计的很巧妙,首先要明确最核心的一点:类加载器之间不是平等的,但是逻辑上的父子关系(不是继承) 如图:

在这里插入图片描述
当一个类被加载的时候 JVM先会判断:

  • 这个类是不是已经被加载过了?加载过了就直接返回加载的class对象,不需要再加载第二次
  • 如果没有被加载过?那么哪个类加载器来搞定它?

这个就是双亲委派机制的核心:

  • 先向上依次查找这个类是不是已经被加载过了,比如java.lang.String是启动类加载器加载的, 你自己也写了一个String类,那么它向上查找的时候发现启动类已经加载过了 就不会在加载了,避免重名重复加载
  • 如果一个类没有被加载过 那么就自顶向下 一层层尝试加载,所谓尝试就是每一层看一下能不能加载 能加载就在这一层处理了 ,不能那就往下一层抛(这个设计思想有点类似异常处理,一个异常抛出来 看当前层面能不能catch 能就处理 不能就往上抛)

打破双亲委派机制

在这里插入图片描述

自定义类加载器

首先我们需要理解一下双亲委派机制 类加载的源码:

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
   
    // 1. 检查是否已经加载过
    Class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值