java class文件的加载过程以及双亲委派机制

java文件的加载过程

1、装载:查找和导入Class文件(loading)

2、链接:其中解析步骤是可以选择的(linking)

(a)检查:检查载入的class文件数据的正确性

(b)准备:给类的静态变量分配存储空间

(c)解析:将符号引用转成直接引用

3、初始化:对静态变量,静态代码块执行初始化工作(initializing)

此处需要注意的一处是2中的准备项,此处是为静态变量进行初始化分配空间但是此时是给变量默认值0,例如代码中有
static int j = 10 在这个步骤中比不是给j赋值10,而是赋值默认的0,到3的时候才会给j赋值10.

双亲委派

什么是双亲委派?

   java在类加载的时候是通过类加载器加载进jvm的,而jvm是采用双亲委派的机制对类进行加载的。

类加载器介绍:
1,Bootstrap:最顶层的类加载器加载lib/rt.jar charset.jar等核心类,是由C++实现的
2,Extension:加载扩展jar包 jre/lib/ext/*.jar或者由-Djava.ext.dirs指定的
3,App:加载calsspath指定内容,我们项目中自己创建的class基本都由此加载器加载
4,custom classloader:自定义加载器

当一个类需要进行加载的时候会自下而上的进行查找,
1:首先看在4的cache中是否存在(也就是是否加载过)存在则直接返回,
2:不存在再去查找3的cache,存在则返回,不存在则查找2的cache,存在则返回,
3:不存在则查找1的cache,存在则返回,
4:不存在尝试加载1看这个类不在自己的加载范围,那么会通知2去加载,
5:2发现不是自己的加载范围则通知3去加载,
6:3发现不是自己的加载范围则通知4去加载,
7:如果4也找不到,加载不了的话则返回错误classNotFound
这一过程就是双亲委派机制
流程图如下
在这里插入图片描述

为什么使用双亲委派机制呢?

使用双亲委派的机制主要原因是安全性,
1:想一下如果此时你自定义一个java.lang,string类,里面对登录的用户名密码进行了记录然后发到自己的邮箱,然后你把这个类发上去,如果没有双亲委派,那么程序加载了你这个类,那么回头用户名密码就都到了你的邮箱里面了,这样是不安全了,存在双亲委派的话再BootStrap中就可以找到string这个类就直接给你返回了,不会再去加载你自定义的string类,起到了安全的作用。

2:还有一个优点就是不浪费资源,就是说都已经加载过的类了就不需要在进行加载了,节省资源,不过主要还是为了安全性考虑。

要如何打破双亲委派机制呢?
重写loadClass就可以,那为什么要重写loadClass,
什么情况下打破:
1,jdk1.2之前,都需要重写laodClass,那时候没有findClass
2,在线程里面设定线程上下文的重写loadClass
3,模块化热启动热部署的时候需要重写loadClass,都有自己的模块指定的classLoad(osgi,tomcat)
ps:双亲委派机制先向上找,再向下委托

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值