类加载顺序详解

类是Java程序中最基本的构造块,其中类的加载是Java程序的重要组成部分,负责将类字节码从磁盘读取到内存中,并且Java虚拟机(JVM)负责在运行中管理这些类。因此我们需要深入研究Java类的加载,从多个方面解释类加载顺序的相关概念。

一、类加载顺序JVM

在解释类加载顺序之前,我们需要先了解Java虚拟机(JVM)对Java类的加载方式。在JVM启动时,会创建三个系统类加载器,分别是:

1. Bootstrap Loader //用于加载Java核心类库
2. Extension Loader //用于加载Java扩展类库
3. AppClassLoader //用于加载应用程序的类

Java虚拟机(JVM)则会依次使用它们来加载我们的类。

二、类加载顺序 父类

在父子类继承类型的Java程序中,父类的加载是在子类加载之前,JVM它先加载父类。这是由JVM 类加载机制规定的,它会先查找父类的类加载器来加载父类。只有在父类加载完成之后再考虑子类的加载。

三、类加载器的加载顺序

在原始的JVM类加载机制中,它会从下列顺序依次寻找类文件:

1. 从 Bootstrap ClassLoader 中寻找类文件;
2. 若 1 失败,则从 Extension ClassLoader 中寻找类文件;
3. 若 2 失败,则从 App ClassLoader 中寻找类文件;
4. 若 3 失败,则使用自定义的 ClassLoader 寻找类文件。

即降低了类加载的耦合性,使得每个类加载器只需要关注需要加载的类和接下来由谁来加载这些类,从而确保类是在使用时才加载,根据使用的不同场景进行相应的加载。

四、类加载顺序配置 子优先

类加载顺序的配置,我们可以通过parent-delegation属性进行设置,不同的配置会导致类的加载顺序不同。当设置parent-delegation=true时,父类加载器会优先于子类加载器尝试加载类,反之,设置parent-delegation=false时,子类加载器会优先尝试加载类。

五、类加载顺序要服务起来才能看到吗

类加载顺序只有在服务起来之后才能看到。类加载器是Java虚拟机为Java应用程序提供的动态加载机制,因此我们必须确保应用程序成功地启动。类加载顺序工作最多的时候就是在Java应用程序启动时,因为在这个时候所有的类都必须被正确地加载才能保证系统的稳定性。

六、父子类加载顺序

在Java中,子类总是会优先于父类被加载。父类的加载必须在创建子类的实例之前完成。Java虚拟机通过类的继承关系来管理不同类的加载顺序,使之满足继承关系的垂直层次。

七、类的加载顺序

在Java程序运行时,每当需要一个类或接口时,Java类加载器就会被调用。如果类加载器没有找到该类或接口,则它会将该请求转发给父类加载器,如果该类或接口已经被父类加载器加载,则自己没有必要重新加载。我们称这种组织结构为“树形”的类加载器结构。

八、类的实例化加载顺序

在一个类被实例化之前,该类必须被加载和初始化。类的实例化由 Java 的 new 关键字完成,加载和初始化分别由类加载器和 Java 虚拟机来完成。所有不是 final 静态字段或变量和内联常量的类成员变量都将在类实例化时进行初始化。

九、类加载的五个过程

类的加载过程可以分为五个步骤:

1. 加载;
2. 验证;
3. 准备;
4. 解析;
5. 初始化。

十、类加载的时间点和加载顺序

类的加载时间点和加载顺序取决于应用程序中需要使用类的时间。当应用程序的代码需要使用某个类时,Java 虚拟机将动态地检查该类是否已加载。如果该类未加载,则 Java 虚拟机使用类加载器来动态加载该类。由于 Java 类库在非常适合使用的时候自然会加载,因此此类库可以适当地进行懒加载。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/205988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-07 17:48
下一篇 2024-12-07 17:48

相关推荐

  • QML 动态加载实践

    探讨 QML 框架下动态加载实现的方法和技巧。 一、实现动态加载的方法 QML 支持从 JavaScript 中动态指定需要加载的 QML 组件,并放置到运行时指定的位置。这种技术…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • 类加载的过程中,准备的工作

    类加载是Java中非常重要和复杂的一个过程。在类加载的过程中,准备阶段是其中一个非常重要的步骤。准备阶段是在类加载的连接阶段中的一个子阶段,它的主要任务是为类的静态变量分配内存,并…

    编程 2025-04-28
  • Lazarus LoadLibrary:DLL动态链接库的加载和使用

    本文将从以下几个方面介绍Lazarus中LoadLibrary和FreeLibrary函数的使用方法: 一、简介 LoadLibrary和FreeLibrary是Windows动态…

    编程 2025-04-27
  • Python set去重保留原顺序

    当一个列表中出现重复的元素时,为了去除这些重复元素可以使用Python提供的集合(set)数据结构,集合可以去除元素的重复出现。然而,这样会导致原有的元素顺序混乱,这时,需要使用一…

    编程 2025-04-27
  • Spring Boot本地类和Jar包类加载顺序深度剖析

    本文将从多个方面对Spring Boot本地类和Jar包类加载顺序做详细的阐述,并给出相应的代码示例。 一、类加载机制概述 在介绍Spring Boot本地类和Jar包类加载顺序之…

    编程 2025-04-27
  • 用Python加载鸢尾花数据

    本文将详细介绍如何使用Python加载鸢尾花数据,包括数据源的介绍、数据的获取和清洗、数据可视化等方面。 一、数据源的介绍 鸢尾花数据集(Iris dataset)是常用的分类实验…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论