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 操作
  • 直接调用类
  • 反射操作
    调用静态成员常量是不触发初始化操作的。

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

猜你喜欢

转载自blog.csdn.net/qq_40981730/article/details/82710778