java中的类加载机制

今天看了许多大牛的解释,现在来做个总结:


类的加载机制过程是指由jvm的类加载器加载class字节码文件进入内存的过程;(暂且这样理解)

类加载器可以分为引导类加载器,扩展类加载器,系统类加载器;有些地方又可以这样分:启动类加载器,自定义加载器。

类加载机制过程:

加载–>验证–准备–解析—>初始化

这里写图片描述

class字节码文件被加载到jvm内存模型中的方法区中。

加载:找到class字节码文件。

验证:验证字节码的安全性,检查字节码中是否有恶意代码等,因为jvm是独立于编译器的,不是每个字节码文件都有编译器进行编译检查错误,防止有些人添加恶意代码破坏。这个过程是非常重要的。

准备:验证之后,后续的准备,解析都在内存中进行了。此过程分配内存空间,进行默认的赋值,但这并不是初始化,比如:

public static int a = 8;
定义了静态成员变量,但是在准备阶段,这里只是默认给a = 0;的默认操作,到了初始化阶段才进行 static{}代码块和静态成员变量的赋值操作,即初始化之后,a = 8。

但是注意,静态常量在准备阶段也给了默认值,该静态常量的值,给了一个常量符号,但到了解析阶段,该常量符号的值,就给了静态常量,所以静态常量的赋值是在解析阶段就完成好的,没有触发初始化。

解析:把相应的符号引用进行替换

初始化:执行static{}代码块,静态成员变量的赋值操作,该过程是顺序进行的,所以这个类加载机制下,出现一个新入门的人看不懂的现象:

static{
a = 90;
}
public static int a = 89;
该过程是这样执行的:
准备阶段,进行静态成员变量a 的默认赋值0,所以静态代码块中是可以对前面没有定义a 进行赋值操作的。然后进行初始化操作,顺序执行,最后 a=89;
这里写图片描述

触发初始化的操作:

  • new 操作
  • 直接调用类
  • 反射操作
    调用静态成员常量是不触发初始化操作的。

今天暂且写到这,以上内容有很多都是看其他大牛的。有错误的请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值