我们已经将整个Class的构成讲述完了,不清楚的同学可以看一下关于Class文件的介绍,但是空有Class并没有什么用,在Class中的各种描述信息都需要被加载到虚拟机以后才能运行使用。
什么是类加载
虚拟机把描述类的数据从Class(Class文件或者网络或者其他地方,其实都是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。这就是虚拟机的类加载。
类加载概念
上图是类加载和卸载的整个过程示意图,其中验证、准备、解析统称为连接阶段。
加载、验证、准备、初始化和卸载这5个阶段开始的顺序是固定的,但是解析阶段在某些情况下可以在初始化以后再进行。
JVM并没有对什么时候开启加载阶段进行强制约束,但是对于初始化阶段严格规定了有且只有5种情况必须立即对类进行初始化:
类加载-加载阶段
加载是类加载的第一个阶段,加载阶段的主要目标是:
二进制字节流的来源可以是(但不仅仅是):
除了上述五种二进制字节流,我们甚至可以在程序运行期间动态生成二进制字节流(动态代理技术)。
非数组类的加载需要通过类加载器实现,既可以使用系统的提供的引导类加载,也可以使用用户自定义的类加载器去完成,关于类加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个类加载器。
对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。
本期类加载的加载阶段就介绍到这,下期我们会讲解类加载的连接阶段,我们下期再见!!!