JVM第二期(双亲委派机制)

对于Java的双亲委派机制,这里不得不提起Java的类加载机制,对于类加载器,具体分为以下的类加载器:
在这里插入图片描述
BootStrapClassLoader:只加载一些jdk核心依赖库中的包,是由c/c++底层实现的,不能作为对象给我们自己使用。
ExtensionClassLoader:扩展类加载器。
ApplicationClassLoader:程序加载器,加载一些Java calsspath和自定义path路径下的类,他和ExtensionClassLoader加载器都可以作为对象给我们使用。
UserClassLoader:我们自定义的类,加载用户自定义的类。

类加载器的一些问题:
1.遇到不同的类加载器,除了读取的二进制流的动作和范围不同外,后续的加载逻辑有不同吗?
2.遇到限定名一样的类,在类加载时会发生什么问题?

JDK的类加载器命名规范规定每个类加载器都有自己的命名空间。

面对一系列问题,JVM的双亲委派机制会有完美的解答:
1.在程序的默认情况下,一个类只会被一个类加载器加载执行,它就是唯一的不会产生歧义。
加载流程
2.在加载时,会向上查找给ApplicationClassLoader,一直寻找其父类是否能够加载此类,在源码中进行判断。

破坏双亲委派机制:重写ClassLoader中的loadClass方法去对双亲委派机制进行破坏,注意,除非我们是在特定的业务场景下,才会去对双亲委派机制进行破坏,否则不要轻易去对双亲委派机制进行破坏,容易破坏jvm的底层。尽可能去遵循双亲委派模型的机制。

优点举例:
若我们想创建一个java.lang.String的类,但是这个类的全限定名与我们核心类库的java.lang.String包重名,这时双亲委派机制就会出现作用:

public class String {
    int a;
    boolean flag;
    @Test
    public void test(){
        String s1=new String();
        s1.a=0;
        s1.flag=false;
        System.out.println(s1.a);
        System.out.println(s1.flag);
    }
}

会向上找到BootStrapClassLoader加载器去加载我们核心类库中已经存在的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值