在上一篇中,有少少的介绍了一下类通过反射的一个加载过程,作为一个开发Java的媛,对于类加载机制还是要有些了解的,先问几个问题:
- Java中加载类的工作谁来做?
- 加载过程包括什么?
- 类能加载,那对象呢?
1、Java中加载类的工作谁来做?
Java虚拟机,将静态字节码文件.class加载到内存中。
2、加载过程包括什么?
类的加载过程,也可以称为类的生命周期,包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。
加载:加载.class文件进内存,获取定义 此类的二进制字节流,在方法区创建Class对象。
连接(验证、准备、解析):
- 验证【重要,但不必须】:保证.class文件中内容符合当前虚拟机的要求,主要的几个验证包括(文件格式验证、元数据验证、字节码验证、符号引用验证)
- 准备:正式为类变量(static)分配内存并设置类变量初始值的阶段。
- 例子:
- public static int value=1,初始值为0值;
- 因为这时候尚未开始执行任何java方法,而把value赋值为1的put static指令是程序被编译后,存放于类构造器()方法之中;
- 所以把value赋值为1的动作将在初始化阶段才会执行;
- 但是如果是用final修饰的,准备阶段的初始值就是1了,因为这个变量会变为常量。
- 解析:虚拟机将常量池内的符号引用替换为直接引用的过程。
初始化:编译器自动收集类中的所有类变量的赋值动作和静态语句块static{}中的语句合并产生的,也就是在准备阶段后,真正的对静态变量赋值。
初始化的触发条件?
(1) 创建类的实例,也就是new的方式
(2) 访问某个类或接口的静态变量,或者对该静态变量赋值
(3) 调用类的静态方法
(4) 反射(如Class.forName(“com.shengsiyuan.Test”))
(5) 初始化某个类的子类,则其父类也会被初始化
(6) Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类
3、类能加载,那对象呢?
对象是根据类创建出来的,所以对象的生命周期就是包含在类的生命周期中:
对象的创建到回收是在类的使用过程中进行的
总结:类的加载过程就是把硬盘中编译好的字节码文件,加载到内存中,并且给类变量赋值的一个过程到类被使用再到类从内存中被卸载的一个过程。
Reference
https://blog.csdn.net/lixingtao0520/article/details/72927775
需要的提前了解一下JVM内存模型、Java.lang.*中的一些类及方法,例如ClassLoader。