类的加载、链接与初始化
一. 键盘一顿操作后 成为.java文件 通过运行后编译为 .class 文件 (硬盘到内存的迁移)
1.有两种类型的类加载器
- java虚拟机自带的加载器
根类加载器 (Bootstrap )
扩展类加载器 (Extension)
系统类加载器 (System)
- 用户自定义的类加载器
java.lang.ClassLoader的子类
用户可以定制类的加载方式
类加载器并不需要等到某个类被 “首次主动使用” 时再加载它
类被加载后,就进入连接阶段。 连接是将已读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
类的加载指的是将类的.class 文件中的二进制数据读入到内存中,将其放在运行时数据的方法区内,然后在堆区创建一个 Class 对象,用来封装类的方法区内的数据结构
只有jvm才能创建class对象, 不管new多少个对象 方法区只有一个类型的对象 (对象的数据结构)只是堆中生成了 多个路径不同的数据等等
类的加载 是由虚拟机来做的, 我们所有反射或者new都是通过堆中的Class 对象,来找到对应的类进行操作的,class是我们整个反射的入口
二. jvm 虚拟机加载时 查找并加载类的二进制.class 文件
链接 :
- 验证:确保被加载的类的正确性 (手工生成文件)
- 准备:为类的 静态变量 分配内存,并将其初始化为(默认值) 默认值:int = 0,boolen = null 等等
- 解析:把类中的符号引用转换为直接引用
三. 初始化 (对类的使用才会被初始化)为类的静态变量赋予正确的初始值 int = 2, boolean = true;(取决于你设定的默认值):
-
Java 程序对类的使用可分为两种
(1) 主动使用
(2) 被动使用
所有的Java虚拟机实现必须在每个类或接口被java程序 “首次使用” 时才初始化主动使用( 6种 ) - 创建类的实例 - 访问某个类的接口的静态变量,或者对该静态变量赋值 - 调用类的静态方法 - 反射 - 初始化一个类的子类 - java虚拟机启动时被标明为启动类 ([ClassLoader](https://blog.csdn.net/qq_37407995/article/details/112762636)) 被动使用 - 其他使用Java类的方式都被看成是对类的被动调用,都不会导致类的初始化
加载.class 文件的方式
- 从本地系统中直接加载 (栈)
- 通过网络下载.class 文件
- 从 zip,jar 等归档文件中加载.class文件
- 从专有数据库中提取.class文件
- 将java源文件动态编译为.class文件