Java加载类(Class)文件过程

其实对于任何编程语言而言,编译和链接都是必不可少的环节,对于java而言编译这环节比较简单,就是按照JVM指定的规范生成字节码文件(Class文件),因为字节码是JVM能认识的,并且会把这些字节码翻译成本地机器的机器指令。至于链接这块,Java作为动态动态编译编程语言,链接这块相对静态链接语言而言要复杂很多。某种程度可以说java的Class文件加载处理的过程其实就是为了完成链接这个目标。链接这个词比较抽象,说白一句话:链接就是想方设法去确定每个对象,每个成员,每个方法在内存中的全局地址。不管是C++还是java都是这个目标。对于C++而言,是通过符号表和每个文件的局部偏移量这两个信息来实现这个目标,而java作为动态编译语言而言,就没那么简单直观了。(其实说java是动态编译语言不如说java是动态链接语言

1.  加载

通过类加载器加载编译好的Class文件,主要工作就是把Class文件中的常量池段放置到JVM方法区的常量池中,把Class文件中的方法代码放置到JVM的方法区中,最终产品是在JVM的堆区中创建了一个Class对象,该对象保存了类相关的一些信息,比如类名等(目前还不知道是否保存了完整的Class文件字节码),并且保存了一份指向方法区中类各种相关数据的指针,作为入口。至于类加载器的子类,双亲委托模型等概念还需进一步了解。

2.  链接

链接的过程分成3小步:

(1)    验证

验证说白了就是验证加载进来的Class文件里面的数据内容是否符合JVM指定的规范,包括格式验证,语义验证,操作验证,如果不满足规范,JVM后续将无法正常使用该类。

(2)    准备

主要就是对静态数据进行分配内存和设定初始值(这个初始值不是代码中指定的初始值,而是JVM按照它的意愿设置的)

(3)    解析

这步是重中之重,主要工作是把方法区中加载进来的常量池中的符号引用通过解析过程替换成直接引用(内存地址),类似C++的符号表在链接时帮助每个成员和方法确定全局偏移量。这也是整个JAVA在加载类文件后完成链接目标的核心最关键一步。具体解析过程后续再补上。

3. 初始化

         这个环节相对简单,就是根据代码的初始化内容对类中的静态数据进行赋值操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章