大家好,又见面了,我是你们的朋友全栈君。
朋友给我发了一道有意思的题目,如下
为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。
这就扯到基础理解上了,就是Java是如何加载一个类的呢?
上图是我绘制的整个Java类加载过程。
首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给类加载器,传输的是刚转换好的字节码文件,也可以是通过网络传输过来的字节码文件,这个是分布式架构下的情况。
然后就是运行期,运行期一开始,类加载器初始化字节码文件,通过本地类库来验证字节码文件的正确性,然后交给JVM的解释器和即时编译器,最后汇合给JVM内部的Java运行系统,都ok了后传给PC的操作系统,最后就是物理硬件层面。
所以问题的答案就有了
.class是JVM将类装入内存,是在编译期间实现的,而编译期间只是做了字节码转换,所以不执行静态块
而class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169718.html原文链接:https://javaforall.cn