课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了java编程开发中java虚拟机的一些基础知识点和应用实践方法,而今天我们就再来了解一下,java编程开发类的加载过程都有哪些步骤。
1、类的加载过程
类的加载全过程包括:加载、验证、准备、解析和初始化5个阶段,是一个非常复杂的过程。这里仅对这五个流程做一个简要介绍
2、加载Loading
在虚拟机规范中,对这一过程的规定并不明确,全靠虚拟机厂商自由发挥,比如,如果通过一个类来找到其二进制字节流都能玩出下面的花样来:
从本地文件系统中直接读取,比如使用IDE调试代码时,直接从电脑的磁盘上读取的class文件
从ZIP压缩包中读取,这也是JAR、WAR格式的基础
从网络中下载,典型的应用场景是WebApplet
运行时计算生成,常见的场景就是动态代理
由其他文件生成,比如JSP文件生成对应的Class文件
从加密文件中获取,这是典型的防Class文件被反编译的保护措施
加载完成后,就进入连接阶段,但需要注意的是,加载阶段与连接阶段的部分动作(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的一部分,这两个阶段的开始时间仍然保持着固定的先后顺序,也就是只有加载阶段开始后,才有可能进入连接阶段。
3、验证Verification
验证是连接阶段的个步骤,其目的是确保被加载的类的正确性,即要确保加载的字节流信息要符合《Java虚拟机规范》的全部约束要求,确保这些信息被当做代码运行后不会危害虚拟机自身的安全。
其实,Java代码在编译过程中,已经做了很多安全检查工作,比如,不能将一个对象转型为它未实现的类型、不能使用未初始化的变量(赋值除外)、不能跳转到不存在的代码行等等。但JVM仍要对这些操作作验证,这是因为Class文件并不一定是由Java源码编译而来,甚至你都可以通过键盘自己敲出来。如果JVM不作校验的话,很可能就会因为加载了错误或有恶意的字节流而导致整个系统受到攻击或崩溃。所以,验证字节码也是JVM保护自身的一项必要措施。
4、准备Preparation
这一阶段主要是为类的静态变量分配内存,并将其初始化为默认值。这里有两点需要注意:
仅为类的静态变量分配内存并初始化,并不包含实例变量
初始化为默认值,比如int为0,引用类型初始化为null
需要注意的是,准备阶段的主要目的并不是为了初始化,而是为了为静态变量分配内存,然后在填充一个初始值而已。
5、解析Resolution
解析阶段是将常量池类的符号引用替换为直接引用的过程。而解析的动作主要是针对类或接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符这7类符号引用进行的。
6、初始化Initialization
类的初始化是类加载过程的后一个步骤,直到这一个步骤,JVM才真正开始执行类中编写的Java代码。
前面也曾说到,在准备阶段,类变量已经根据系统要求赋值为初始零值,而在初始化阶段,则会根据代码的逻辑去初始化类变量和其它资源。
Java编译器在编译过程中,会自动收集类中所有类变量的赋值动作以及静态代码块,将其合并到类构造器<clinit>()方法,编译器收集的顺序是由语句在源文件中出现的顺序决定的。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。