关于类加载和双亲委派问题的简单解答

类加载和双亲委派

一个Java文件在投入使用需要经历两个阶段,分别为编译和类加载.
编译就是将Java源文件(.Java的文件)经过Java编译器变成字节码文件(.class)

加载就是将编译的字节码文件加载到JVM中,加载成功后会得到一个class对象,我们就可以使用new关键字来实例化这个对象了
(简而言之,就是查找并加载类的二进制数据,并生成class对象实例的过程)

并且类的加载过程涉及到类加载器,JVM在运行时会产生3个类加载器,从最高级到下分别为 (bootstrap classloader)准备加载器,(extension classloader)拓展加载器,(application classloader)应用加载器 每个加载器加载不同范围的jar包
除了系统提供的加载器以外,还可以通过classloader类实现自定义加载器去满足特定需求

按照JVM的规范,类从class文件加载到内存,到最后卸载,包含了七个阶段: 加载,验证,准备,解析,初始化,使用,销毁


而双亲委派模型呢,就是按照类加载器的层级关系,逐层进行委派
比如说当我们需要加载一个字节码文件(.class),首先会去把这个class文件的查询和加载委派给其父加载器去执行,如果父加载器都无法去加载,那么再尝试自己去加载这个class文件

设计好处:
1.安全性:这种层级关系可以确保所有类能够优先交给到bootstrap classloader检查执行,这样子就能确保核心类库的一些类不会被破坏
比如自己写一个 Java.lang.string 最终也是会交给bootstrap classloader,这样子自己写的Java.lang.string就没有办法去覆盖核心类库的类

2.避免重复加载: 因为父加载器已经加载过了,子加载器就没有必要再去加载了
比如自己写的Java.lang.string需要加载,但子加载器不知道父加载器已经加载过了这个类,所以就会向父加载逐层委派确定有了,自己就不需要加载了.如果不先经过父加载器自己就先加载的话就会重复加载了.

如何确定父加载器返回的信息呢,如果父加载器的返回值是null的话,就是父加载器没有的类,因此自定义加载器可以加载,如果不为null的话就是父加载器有的类,自定义加载类就不需要加载了.

注:向上委托时会查询对应缓存,不是单纯委托

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值