类加载过程

类加载器

Java 类加载器从上到下,有以下分类
(1)Bootstrap ClassLoader:是权力最高的类加载器,是在JVM启动的时候自动创建的,一般由与操作系统有关的本地代码实现,负责装载最核心的Java类,比如Object,System,String等;
(2)Platform ClassLoader:是平台类加载器,是JDK9版本的类加载器,用于加载一些扩展的系统类,比如XML,加密,压缩相关的功能,JDK9之前的版本是Extension ClassLoader;
(3)Application ClassLoader:应用类加载器,主要加载用户定义的CLASSPATH下的类。
Bootstrap 是通过C/C++实现的,不存在JVM体系内,后两种由Java语言实现,用户也可以自定义类加载器,类加载器有等级高低,但不存在继承关系,以组合方式来复用各加载器,以下是双亲委派模型

在这里插入图片描述
当需要加载某个类A时,依次向上询问是否已经加载此类,一直询问到Bootstrap ClassLoader ,然后再向下尝试加载此类,如果都加载不了,则通知一开始发起加载请求的类加载器加载类A。
(4)用户自定义加载类:哪些情况需要用户自定义类加载器:1)隔离加载类,某些容器框架需要把类加载到不同环境,使应用中的jar包和中间键运行时的jar包互不影响。2)修改类加载方式,双亲委派模型并非强制模型,除了Bootstrap,其他的加载并非一定要引用,可以根据实际情况需要再特定的时间点加载对应的类。3)扩展加载源,比如从数据库/网络/机顶盒加载。4)防止源码泄露,java代容易被编译和篡改,可以进行编译加密,那么类加载器也需要自定义,还原加密的字节码。
实现自定义类加载器的步骤,继承Class Loader,重写findClass()方法,调用defineClass()方法

类加载过程

ClassLoder(类加载器)的作用,就是提前把.class文件加载到内存中,加载到内存中的类才可以实例化。类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。
类加载过程包括:加载(Load),链接(Link),初始化(Init)
(1)加载:Loa阶段读取类文件产生的二进制流,并转化为特定的数据结构,初步校验cafe babe魔法数,常量池,文件长度,是否有父类等,然后创建对应类java.lang.Class 实例;
(2)链接:链接阶段包括验证,准备,解析三个步骤。验证是更详细的校验,比如final是否合规,类型是否正确,静态变量是否合理等,准备阶段是为静态变量分配内存,并设定默认值,解析类和方法,确保类与类之间的相互引用正确性,完成内存结果布局;
(3)初始化:Init阶段执行类构造器方法,如果赋值运算是通过其他类的静态方法类完成的,那么会马上解析另外一个类,在虚拟机中执行完毕后通过返回值进行赋值。

以上摘自《码出高效-java开发手册》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值