java类加载详细

mac2025-05-02  12

类加载器

在java中如果一个类收到类加载请求,它不会自己直接去加载,而是把请求委派给父类的加载器,直到启动类加载器。只有父类加载器无法加载时,子类才会尝试自己加载。

双亲委派模型

启动类加载器 是最顶层的加载器 加载lib目录中的类扩展类加载器 加载lib/ext目录中的类应用程序类加载器 负责加载classpath的类库,如果没有自定义的加载器,那么就是用系统默认的。 (getSystemClassLoader()可以获取到这个加载器)

类加载机制

1.加载

主要将class文件的字节流读入到jvm中生成class对象

通过全限定名获取到文件二进制字节流 把静态存储结构(文件)转化为方法区的运行时数据结构(jvm内存) 最终生成一个class对象

链接

2.验证

确保加载的字节流符合jvm规范

3.准备

为静态变量(static)在方法去分配内存并设置默认值

4.解析

jvm常量池的符号应用换为直接引用 在类的加载过程中的解析阶段,Java虚拟机会把类的二进制数据中的符号引用 替换为 直接引用,如Worker类中一个方法:

public void gotoWork(){ car.run(); //这段代码在Worker类中的二进制表示为符号引用 }

在Worker类的二进制数据中,包含了一个对Car类的run()方法的符号引用,它由run()方法的全名和相关描述符组成。在解析阶段,Java虚拟机会把这个符号引用替换为一个指针,该指针指向Car类的run()方法在方法区的内存位置,这个指针就是直接引用。

5.初始化

1.根据赋值语句为程序中的 类变量(static)赋值2.按顺序从静态变量静态代码块普通变量普通代码块构造函数 有继承时 :父类—》子类父类的静态变量静态代码块子类静态变量子类静态代码块父类普通变量父类普通代码块父类构造器子类普通变量子类普通代码块子类构造器

什么时候需要初始化

1.使用new实例化这个类时 2.调用类静态方法时 3.读取/设置类变量时 3.使用反射Class.forName(“xxx”) 进行反射调用时 4.标为启动类 5.子类被初始化时

最新回复(0)