从本讲开始,我就要来给大家详细说一下类的加载过程所蕴含的三个阶段了。
加载阶段详述
首先,我们来看一下类的加载过程的第一个阶段,即Loading阶段,翻译过来便是加载阶段。注意,这里大家一定要区分清楚这样一个概念,就是我们这里提到的类的加载过程它是一个宏观上的概念,只不过它又分为了具体的三个阶段而已,而恰恰好其中第一个阶段就是加载,很明显,此处的加载是一个狭义上的概念。说这么多,我就是希望大家能够区分清楚类的加载过程是一个宏观上的概念,而它其中的第一个阶段(即加载)则是一个狭义上的概念而已,嘿嘿🤭,你可别把它俩给整混了哟!
关于加载这一阶段,我想大家是务必要清楚地认识到如下这样三个说明的。
先来看第一个说明,即通过一个类的全限定名获取定义此类的二进制字节流。想必大家都知道字节码文件极有可能就是物理磁盘上的一个文件,而在上一讲我们也讲过了,物理磁盘上的字节码文件加载到内存当中就是以二进制流的方式来进行加载的,关于流,我想大家应该是再熟悉不过了。
然后,我们再来看一下第二个说明,即将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。注意,加载的类信息是被存放在了一块称为方法区的内存空间当中,说到方法区,我想大家应该知道它就是一个虚的概念,至于具体落地实现,则就要看JDK的版本了,在JDK 7及之前,方法区的具体落地实现被称为永久带,之后便改称为元空间了。
最后,我们来看一下第三个说明,即在内存中生成一个代表这个类的java.lang.Class
对象,作为方法区这个类的各种数据的访问入口。相信只要是学过反射的