初识.class文件是如何加载到JVM中的

编程入门的第一个例子是HelloWorld,第一次老师还是用javac执行给我们看的,当时就觉得Dos输出HelloWorld挺神奇,对于javac编译后执行的的.class文件并没有去弄明白是什么。近期也一直在疯狂补课,本章就专门来说说这个.class是怎么被弄到JVM中并实例化的。

先来理解几个概念

  1. .class是什么
  2. JVM是什么

.class 即字节码文件,由java编写的源文件编译成字节码文件,只能由JVM来解释执行。换句话说只要虚拟机可以解释并执行它。.class文件反编译还是很方便的,有兴趣可以下载一个JAVA反编译工具试一下。

JVM 即JAVA虚拟机,JVM对应的是操作系统,而操作系统对应的才是真正的底层硬件。而我们java coder确切的说是面向JVM编程,因为最终我们编写的java源文件都要被编译器编译成.class字节码文件,然后最终由JVM来解释运行。不过目前JVM已经不能单独叫做JVM了,应该叫做VM (虚拟机) ,现在好多语言都是基于JVM的,比如scada什么的(我没有用过),他们就是编译生成.class然后在JVM上跑,而JVM现在更像是一个平台。这里的.class文件是一种具有规范格式的文件,并不特指由JAVA编译生成的,你任何语言只要符合.class规范就能在JVM上跑。所以概念要清楚。

初识.class文件是如何加载到JVM中的_第1张图片
了解了上述两个概念后,来看我们下面一张图
初识.class文件是如何加载到JVM中的_第2张图片

一个.class文件加载到JVM中要经过三个步骤。
1.由ClassLoader将.class字节码文件加载到JVM中去,等待后续过程。(此时的Class对象还不可用)
2.链接。(该步骤分为三个小步骤 (1)检查.class文件的正确性.。(2)给静态变量分配存储空间。(3)解析:将符号引用转换成直接引用)
3.初始化:对静态变量和静态代码块进行初始化工作。

总体步骤从下图可以看出:
初识.class文件是如何加载到JVM中的_第3张图片

JVM会根据我们的.class文件,为我们在JVM中构建一个Class对象出来。而后续我们的new操作产生的实例对象都是依据这个Class来的。

关于加载的具体原理主要就是设计到ClassLoader的知识了。

分享一篇文章,这篇文章讲的可以说是非常好了。有兴趣的同学可以看一下。

ClassLoader是如何把.class文件以流的形式加载到JVM中的。主要涉及到三个加载器还有一个双亲委派机制,挺有意思,大家可以看一下。

你可能感兴趣的:(知识点,JVM,.class)