类的加载流程是怎么进行的?

TheDisguiser 2020-05-07 16:16:02 java常见问答 4684

在java学习中,学习的不只是单单知道怎么使用就行了,还要知道程序运行的各种机制、流程,本文就带大家了解一下java中类的加载流程,希望对你们有所帮助。

首先我们来了解一下java类,类简单的说就是一个同时具备某些特征的实体的集合,它可以说是一种较抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象概念。

类的加载流程主要为三个阶段:

1. 加载阶段

简单的说,类加载就是把它的class文件中二进制数据读取至内存中,然后将该字节流所代表的静态存储结构转为方法区中运行时的数据结构,并在堆内存生成一个该类的java.lang.Class对象,类的加载最终产物就是堆内存的class对象,对同一个ClassLoder来讲。不管一个类加载过多少次,对应的堆内存class对象始终只能是一个,类的方法访问的数据结构入口,如图:

类的加载流程

2. 连接阶段

类的连接阶段有三个过程:

1)验证

验证过程在连接阶段中的主要目地是为了确保class文件的字节流所包含的内容一定符合jvm规范,且没有危害JVM自身安全的代码。一旦验证不符合要求,就会抛出VerifyError异常及其子异常。

主要验证内容有:

文件格式验证:验证包括文件头部魔术因子在内容、class文件的MD5指纹、文件主次版本号、各种变量类型支不支持等。

元数据验证:对类的字节流进行分析,判断其是否符合java语法。

字符码验证:验证程序的主要控制流程

符号引用验证:验证在类中使用符号为转换直接引用的合法性。

2)准备

这个阶段需做的事就是在方法区为静态变量发配内存以及赋初始默认值。

3)解析

在常量池中寻找接口、类、方法、及字段的符号引用,并把这些符号引用换为直接引用的过程就是解析。

解析一般会针对接口、类、方法、及字段四类进行。

3、初始化阶段

初始化阶段是整个类加载过程中最后一个阶段,初始化阶段最主要的一件事情就是执行了()方法的过程,其字面含义就是class initialize,在()方法中所有的类变量都会被赋予正确的值,也就是在程序编写的时候指定的值。

()方法会在编译阶段生成,就是说它已经包含在class文件中了,这个方法会包含所有类变量的赋值动作和静态代码块的执行代码,编译器收集的顺序是由执行语句在源文件中出现顺序所决定的,除此之外需要注意的是静态语句块只可以对后面的静态变量进行赋值,不能进行对其访问。否则编译无法通过,只会负责赋值和执行静态代码块。

以上就是本文的所有内容了,更多java常见问答相关内容请继续关注我们了解更多吧。