深入理解Java 类加载全过程

关于“深入理解Java类加载全过程”,下面是一份完整攻略,由以下几个部分构成:

背景

Java是一门面向对象的语言,其执行方式和传统的编译型语言有所不同。Java的执行分为编译阶段和运行阶段,其中涉及到Java类的加载、验证、准备、解析、初始化等环节。

类加载全过程

Java类的加载过程分为以下几步:

1. 加载

类加载器首先从CLASSPATH中找到指定类文件,读取类文件中的二进制数据,并将其存储在方法区(JDK1.8之前的永久代,JDK1.8之后是元空间)中,以便在JVM后续的执行过程中调用。

2. 验证

虚拟机需要进行类文件的验证以确保其符合Java虚拟机规范要求,主要包括以下验证内容:

  • 文件格式验证:验证字节流是否符合Class文件格式的规范。
  • 元数据验证:对字节码描述的信息进行语义分析,以保证其符合Java语言规范。
  • 字节码验证:通过数据流和控制流分析,确定程序语义是否合法、符合逻辑。
  • 符号引用验证:确保应用程序中的符号引用能够正确解析为引用的目标类或成员。

3. 准备

准备阶段是为类的静态变量分配内存并设置默认初始值,非静态变量不包括在准备阶段中,因为非静态变量是在对象实例化时才会进行初始化。

4. 解析

解析阶段将符号引用替换为直接引用的过程,也就是得到加载类所需的信息,例如在常量池中查找类、方法的直接引用等。

5. 初始化

类初始化阶段即执行类的构造器()方法的过程,()方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的。

示例说明

下面以两个示例说明Java类加载的全过程。

示例1

代码:

public class TestClassLoad {
    public static void main(String[] args) {
        Son s = new Son();
        System.out.println(s.age);
    }
}
class Grandpa {
    public Grandpa() {
        System.out.println("Grandpa()");
    }
}
class Father extends Grandpa {
    public Father() {
        System.out.println("Father()");
    }
}
class Son extends Father {
    public int age = 10;
    public Son() {
        System.out.println("Son()");
    }
}

输出结果:

Grandpa()
Father()
Son()
10

分析:

在程序开始执行时,先有类加载器加载了TestClassLoad类,当前正是处于初始化过程中,因此先会执行Grandpa类中的构造方法,打印出"Grandpa()"。接下来,Father类继承了Grandpa类,并调用了Grandpa的构造方法,紧接着执行自己的构造方法,打印出"Father()"。Son类同样继承了Father类,并分别调用了Grandpa和Father的构造方法,然后执行自己的构造方法,打印出"Son()"。最后,打印出Son的年龄为10。

示例2

代码:

public class TestClassLoad2 {
    public static void main(String[] args) {
        ClassLoader classLoader = TestClassLoad2.class.getClassLoader();
        System.out.println(classLoader);
        ClassLoader parentClassLoader = classLoader.getParent();
        System.out.println(parentClassLoader);
        ClassLoader grandClassLoader = parentClassLoader.getParent();
        System.out.println(grandClassLoader);
    }
}

输出结果:

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@3572469c
null

分析:

在示例2中,我们通过TestClassLoad2.class.getClassLoader()获取该类的类加载器对象,然后通过调用getParent()方法获取其父类加载器对象,最后我们再次调用getParent()方法获取其祖父类加载器对象。运行结果中打印出了该类加载器对象、其父类加载器对象和其祖父类加载器对象,分别是AppClassLoader、ExtClassLoader和null。因为Java虚拟机中的类加载器分为三层:启动类加载器、扩展类加载器和应用程序类加载器,而应用程序类加载器又叫作系统类加载器。

结论

通过上述的例子,我们可以看出Java类的加载过程并不是一蹴而就的,而是包括了加载、验证、准备、解析、初始化等环节,在这个过程中,Java虚拟机必须完成从加载到初始化的整个过程,才能为后续的执行提供支持。因此,我们需要充分理解Java类的加载过程,并在实际开发中根据实际情况进行优化和调整,从而保证程序的正常运行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Java 类加载全过程 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 批处理字符串截取的实现

    批处理字符串截取是一种常用的技巧,在批处理中可以通过截取字符串的方式,提取所需的子字符串,并进行处理。下面将介绍实现批处理字符串截取的攻略。 1. 实现方式 在批处理中,可以通过变量名%varname:str1=str2%的形式,将字符串str1中出现的所有子字符串str2替换为其后的内容。这是实现字符串截取的基础。 具体实现时,可通过以下几个步骤实现: 将…

    other 2023年6月20日
    00
  • SpringBoot加载读取配置文件过程详细分析

    SpringBoot加载读取配置文件的过程 SpringBoot在启动过程中会对其内部的配置文件和外部的配置文件进行加载,这里主要介绍其在启动过程中读取配置文件的过程。 具体的过程如下: 第一步:SpringBoot在启动过程中会先加载其内部的配置文件,包括 application.properties 和 application.yml。如果两个文件都存在…

    other 2023年6月25日
    00
  • Powershell中创建自定义对象例子

    以下是使用标准的Markdown格式文本,详细讲解在PowerShell中创建自定义对象的完整攻略: PowerShell中创建自定义对象的方法 使用New-Object命令创建自定义对象:PowerShell中可以使用New-Object命令创建自定义对象。按照以下步骤进行操作: 定义自定义对象的属性:首先,需要定义自定义对象的属性。可以使用Add-Mem…

    other 2023年10月15日
    00
  • mysql创建表添加字段注释的实现方法

    MySQL创建表添加字段注释的实现方法可以分为以下几个步骤: 步骤一:创建表 首先,我们需要在MySQL数据库中创建一个需要添加注释的表。具体的操作可以使用以下语句: CREATE TABLE `example` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键’, `name` varchar(255) …

    other 2023年6月25日
    00
  • jdk的收费问题

    JDK的收费问题 JDK (Java Development Kit) 是 Java 的开发工具包,开发者可以使用 JDK 来开发 Java 应用程序。但是,自jdk 11以后,Oracle将 JDK 的许可策略更改为收费制度,这给许多 Java 开发者带来了困惑和不便。 JDK 11 及之后的版本 从 JDK 11 开始,Oracle 决定将 JDK 分成…

    其他 2023年3月29日
    00
  • 华硕路由器怎么设置?ASUS无线路由器设置图解

    以下是“华硕路由器怎么设置?ASUS无线路由器设置图解”的完整攻略: 1. 准备工作 在开始设置华硕路由器前,请确保已经准备好了以下物品: 华硕路由器 电脑或手机 网络线 2. 连接华硕路由器 将华硕路由器插上电源,然后通过网络线将路由器与电脑或手机相连。如果您的华硕路由器支持无线连接,您也可以通过无线方式与路由器相连。 3. 进入华硕路由器设置 在电脑浏览…

    other 2023年6月27日
    00
  • Spy++的使用方法及下载教程

    Spy++的使用方法及下载教程 简介 Spy++是一款由微软提供的Windows开发工具,用于监控、调试和分析Windows应用程序之间的交互和消息传递。它能够帮助开发人员深入了解和调试Windows应用程序的行为。 下载Spy++ Spy++是Visual Studio的一部分,可以直接从Visual Studio安装。 首先,下载并安装Visual St…

    other 2023年6月28日
    00
  • iphone6s提示剩余空间不足怎么办 苹果6s出现内存不足解决方法

    iPhone 6s提示剩余空间不足怎么办 苹果iPhone 6s是一款功能强大的智能手机,但由于其存储空间有限,可能会出现内存不足的问题。在这篇攻略中,我将为您提供解决iPhone 6s内存不足问题的方法,并提供两个示例说明。 方法一:清理不必要的文件和应用 删除不需要的照片和视频:打开相册应用,浏览并删除您不再需要的照片和视频。您可以选择手动删除每个文件,…

    other 2023年8月2日
    00
合作推广
合作推广
分享本页
返回顶部