Java类加载过程图解

版权声明:本文为博主原创文章,转载请附上链接。 https://blog.csdn.net/qq_36182135/article/details/81946152

朋友给我发了一道有意思的题目,如下

为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。

这就扯到基础理解上了,就是Java是如何加载一个类的呢?

上图是我绘制的整个Java类加载过程。

首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给类加载器,传输的是刚转换好的字节码文件,也可以是通过网络传输过来的字节码文件,这个是分布式架构下的情况。

然后就是运行期,运行期一开始,类加载器初始化字节码文件,通过本地类库来验证字节码文件的正确性,然后交给JVM的解释器和即时编译器,最后汇合给JVM内部的Java运行系统,都ok了后传给PC的操作系统,最后就是物理硬件层面。

所以问题的答案就有了

.class是JVM将类装入内存,是在编译期间实现的,而编译期间只是做了字节码转换,所以不执行静态块

而Class.forName()是在运行期间,JVM除了装入类外,同时通过类加载器对字节码文件进行校验,所以对静态块进行了初始化。

猜你喜欢

转载自blog.csdn.net/qq_36182135/article/details/81946152