Java的类加载过程可以分为以下几个步骤,这些步骤是由Java虚拟机(JVM)的类加载器(ClassLoader)完成的:
1. 加载(Loading):
类加载器根据类的全限定名(包名+类名)从文件系统或网络等源中找到.class文件。
读取.class文件的内容,并将字节码转换为方法区的内部数据结构。
在堆内存中创建一个Class对象,代表了这个类。
2. 验证(Verification):
验证加载的字节码是否符合Java语法规则,确保其不会危害JVM的安全性。
检查类的结构,如常量池、字段、方法等是否正确。
验证操作数栈和局部变量表的大小是否足够。
3. 准备(Preparation):
分配内存给类的静态变量,并将其初始化为默认值(比如int为0,引用类型为null)。
对常量池中的符号引用进行解析,但不涉及具体的类或接口实例。
4. 解析(Resolution):
将符号引用转换为直接引用,即将类、接口、字段和方法的引用从名称变为内存地址或者直接指向目标的指针。
这个阶段可能会涉及到类之间的关联,如父类引用、接口实现等。
5. 初始化(Initialization):
如果类有静态初始化块(static { ... }),那么会执行这些初始化代码。
初始化类的静态变量,赋予它们被定义时的初始值。
如果父类还没有初始化,那么先初始化父类。
6. 使用(Using):
类加载后,就可以在程序中使用了,创建类的实例,调用类的方法等。
7. 卸载(Unloading):
通常,JVM不会主动卸载类,除非JVM退出或类的加载器被卸载,且该类及其子类的引用都不存在。
这个过程是动态的,只有当类被首次使用(比如通过new关键字创建实例、访问静态字段或方法、反射等)时,才会触发加载和后续的步骤。如果类已经被加载,再次请求加载时,JVM会直接使用已加载的类,跳过加载步骤。
java的类加载过程
于 2024-05-21 10:22:47 首次发布