Java程序,最开始是一个Java文件,编译成.class文件,运行Java程序,JVM就会读取.class文件,把文件的内容,放到内存中,并且构造成.class类对象
这里的加载是整个类加载的一个阶段,他和类加载是不同的
在整个类加载的过程中 主要任务就是找到.class文件 打开文件 读取文件内容 ,并且尝试解析格式
双亲委派模型 描述类加载的过程中 如何找到.class文件
JVM加载.class文件的时候,需要用到"类加载器"模块,JVM中自带了三个类加载器 Bootstrap ClassLoader,Extension ClassLoader,Application ClassLoader
此处的三个类加载器有"父子关系",在一个对象内有一个parent引用指父类加载器实例
检查当前.class文件的格式 是否符合要求
.class文件虽然是二进制文件 但是内部也是有一定结构的
魔数(magic number) .class文件的开头四个字节是一个固定的魔数,用于标识该文件是否为有效的.class文件
版本信息 两个字节的版本号 表示编译器的主版本和次版本号,用于确定使用的Java编译器的版本
常量池(constant pool) 常量池是 .class 文件中最重要的部分之一,它存储了类、接口、字段、方法等元素的符号引用和常量值。常量池是一个表结构,以 1 开始计数,包含了若干个常量池项。
访问标志 访问标志用于描述类或接口的访问权限和特性,如是否为 public、final、abstract 等。
类索引 类索引指向常量池中类或接口的描述符;父类索引指向常量池中父类的描述符;接口索引表列出了实现的接口的描述符。
字段表和方法表 字段表包含了类或接口中定义的所有字段的信息,如名称、类型、修饰符等;方法表包含了类或接口中定义的所有方法的信息,如名称、参数类型、返回类型、修饰符等。
属性表 属性表包含了类、字段和方法的附加信息,如编译器生成的代码、注解等。属性表是可选的,可以包含零个或多个属性。
总的来说 一个Java文件里的所有信息 在.class文件中都会有所体现
准备阶段是正式为类中定义的变量,即静态变量 分配内存并设置变量初始值
Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程
.class文件中 不知道字符串真实的内存地址是在哪里,只知道一个相对的偏移量 也就是知道字符串的内容在.class文件的哪个地方 等到字符串内容加载到内存之后,就可以把真实 的地址,替换到刚才的符号引用这里了
初始化阶段,Java虚拟机真正开始执行类中编写的Java程序代码 将主导权移交给应用程序,初始化阶段就是执行类构造器方法的过程