通过之前的介绍可知,类加载过程共有5个步骤,分别是:加载、验证、准备、解析、初始化。其中,验证、准备、解析称为连接。下面详细介绍这5个过程JVM所做的工作。
加载
注意:“加载”是“类加载”过程的第一步,千万不要混淆。
1. 加载的过程
在加载过程中,JVM主要做3件事情:
- 通过一个类的全限定名来获取这个类的二进制字节流,即class文件:
在程序运行过程中,当要访问一个类时,若发现这个类尚未被加载,并满足类初始化时机的条件时,就根据要被初始化的这个类的全限定名找到该类的二进制字节流,开始加载过程。 - 将二进制字节流的存储结构转化为特定的数据结构,存储在方法区中;
- 在内存中创建一个java.lang.Class类型的对象:
接下来程序在运行过程中所有对该类的访问都通过这个类对象,也就是这个Class类型的类对象是提供给外界访问该类的接口。
2. 从哪里加载?
JVM规范对于加载过程给予了较大的宽松度。一般二进制字节流都从已经编译好的本地class文件中读取,此外还可以从以下地方读取:
- 从压缩包中读取
如:Jar、War、Ear等。 - 从其它文件中动态生成
如:从JSP文件中生成Class类。 - 从数据库中读取
将二进制字节流存储至数据库中,然后在加载时从数据库中读取。有些中间件会这么做,用来实现代码在集群间分发。 - 从网络中获取
从网络中获取二进制字节流。典型就是Applet。
3. 类 和 数组加载过程的区别?
数组也有类型,称为“数组类型”。如: