类加载的过程
加载、验证、准备、解析和初始化这五 个阶段所执行的具体动作
加载
“加载”(Loading)阶段是整个“类加载”(Class Loading)过程中的一个阶段,希望读者没有混淆 这两个看起来很相似的名词。在加载阶段,Java虚拟机需要完成以下三件事情:
- 通过一个类的全限定名来获取定义此类的二进制字节流。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入 口。
相对于类加载过程的其他阶段,非数组类型的加载阶段(准确地说,是加载阶段中获取类的二进 制字节流的动作)是开发人员可控性最强的阶段。加载阶段既可以使用Java虚拟机里内置的引导类加 载器来完成,也可以由用户自定义的类加载器去完成,开发人员通过定义自己的类加载器去控制字节 流的获取方式(重写一个类加载器的findClass()或loadClass()方法),实现根据自己的想法来赋予应用 程序获取运行代码的动态性。
对于数组类⽽⾔,情况就有所不同,数组类本身不通过类加载器创建,它是由Java虚拟
机直接在内存中动态构造出来的。但数组类与类加载器仍然有很密切的关系,因为数组类
的元素类型(Element Type,指的是数组去掉所有维度的类型)最终还是要靠类加载器来完
成加载,⼀个数组类(下⾯简称 为C)创建过程遵循以下规则: