类加载器相关的问题

BootstrapClassLoader  jdk/lib
ExtensionClassLoader   jdk/lib/ext
AppClassLoader    classpath
类加载器:向上查找,向下加载,
getParent()获取其父 ClassLoader,如果getParent返回的ClassLoader==null
也就是代码中ClassLoadernull的话,那么该类是通过BootstrapClassLoader

视频讲解

1、如果我们不想打破双亲委派模型,就重写 ClassLoader 类中的 findClass() 方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。
2、但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。

为什么是重写 loadClass() 方法打破双亲委派模型呢?双亲委派模型的执行流程已经解释了:

解答:类加载器在进行类加载的时候,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成(调用父加载器 loadClass()方法来加载类)。

protected Class<?> loadClass(String name, boolean resolve){
	if (parent != null) {
        //当父类的加载器不为空,则通过父类的loadClass来加载该类
        c = parent.loadClass(name, false);//递归调用父类,这就是为什么打破就要冲洗loadClass方法,
    } else {
        //当父类的加载器为空,则调用启动类加载器来加载该类。
        c = findBootstrapClassOrNull(name);
    }
    //上面一直递归,走到这里一定是说明
    if (c == null) {
        //当父类加载器无法加载时,则调用findClass方法来加载该类
        //用户可通过覆写该方法,来自定义类加载器
        c = findClass(name);
    }
}

JVM 判定两个 Java 类是否相同的具体规则 :JVM 不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即使两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相同。

原文地址:跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值