java类加载过程

根据冯.诺依曼定义的计算机模型,任何程序都需要加载到内存才能被CPU执行,同样的java中的.class文件也需要加载到内存才能实例化类。ClassLoader负责加载.calss文件到内存中,加载类时使用的是双亲委派模型,接下来进行详细的介绍

类加载过程

类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。
java的类加载是一个运行时核心基础模块,主要是在启动之初进行类的
Load(加载)、Link(链接)、Init(初始化)

  • 第一阶段为Load阶段,这一阶段的工作是读取字节码文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe魔法数、常量池、文件长度、是否有父类等,然后创建对应类的java.lang.class实例
  • 第二阶段即Link阶段,可以分为验证、准备、解析三个小的步骤。验证是较为详细的校验,进行final是否合规、类型是否正确、静态变量是否合法等校验操作。准备阶段是为静态变量分配内存并初始化默认值。解析阶段是解析类个方法确保类与类之间的相互引用正确性,完成内存结构布局。
  • 第三阶段是Init阶段,这一阶段会调用类构造器的方法,如果赋值运算是通过其他类的静态方法来完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。
    在这里插入图片描述

类加载器

类加载器有三种,按层次分的话就是三层。
第一层为Boostrap加载器,它是在JVM启动时创建的,通常由与操作系统相关的本地代码实现,负责装载最核心的java类,比如Object、System、String等。
第二层在JDK9中称为Platform ClassLoader(平台类加载器),用以加载一些扩展的系统类,比如XML、加密、压缩相关的功能类等,在JDK9之前是Extension ClassLoader。
第三层是Application ClassLoader的应用加载器,主要加载用户自定义的CLASSPATH路径下的类。

双亲委派模型

在这里插入图片描述
低层次的当前类加载器,不能覆盖高层次类加载器已经加载的类。如果低层次的类加载器需要加载一个未知类,需要向上逐级询问,询问完毕后逐层尝试是否可加载,具体含义见上图,不在此展开详述。

自定义类加载器

用户可根据需要自定义类加载器,下面是需要自定义类加载器的几种情况:

  1. 隔离加载类:在某些框架内进行中间件与应用模块隔离,把类加载到不同的环境中
  2. 修改类加载方式:类的加载并非强制,除bootstrap外,其他的加载并非要引入,或者根据实际情况在某个时间点进行按需进行动态加载
  3. 扩展加载源:比如从数据库、网络,甚至是电视机机顶盒进行加载
  4. 防止源码泄露:java代码容易被编译和篡改,可以进行编译加密,那么类加载器也需要自定义以便还原加密的字节码
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值