new关键字发生了什么系列(一)类加载

本文详细介绍了Java中的类加载过程,包括加载、验证、准备、解析和初始化五个阶段。类加载涉及类加载器的工作原理,如启动类加载器、扩展类加载器和应用类加载器。此外,文章还讨论了类加载机制,如双亲委派模型,以及类初始化的触发条件。最后,提到了一些特殊情况,如静态变量的引用和数组定义不会触发初始化。
摘要由CSDN通过智能技术生成

0x01 类加载过程

加载

目的:class文件无论是通过文件、网络的形式获取都将转换成二进制流加载到内存中。

  • 通过类的全限定名获取类的二进制流
  • 将字节流代表的静态存储结构转换为方法区的运行时数据结构(此处的方法区涉及到java内存结构)
  • 在内存中生成一个代表该类的Class对象,作为方法区这个类的各种数据访问入口

在这里我们可以知道class文件被加载之后放在了内存结构中的方法区。同时jvm会自动实例化一个Class对象的实例,至于这个实例放在哪里,由具体的虚拟机决定,hotspot将其放在了方法区

验证

目的:确保class文件的字节流中包含的信息符合当前虚拟机要求,并且是安全的

从这个阶段可以看出,其实验证阶段是在加载阶段开始的时候就夹杂在其中开始了。

该阶段会进行如下验证:

  • 文件格式验证:字节流是否符合Class文件格式规范
  • 元数据验证:字节码描述的信息进行语义分析(对类、字段、方法等语言格式校验)
  • 字节码验证:验证数据流和控制流,确定语义是符合逻辑的(if-else是不是跳错了)
  • 符号引用验证:验证虚拟机将符号引用转换为直接引用是否出错(NoSuchMethod异常在这里会出现)

准备

目的:为类变量分配内存并设置类变量初始值(该初始值指的是对应类型的默认初始值,如int的默认初始值是0)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值