您的位置:

类加载顺序详解

类是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 类库在非常适合使用的时候自然会加载,因此此类库可以适当地进行懒加载。