深入理解Java 类加载全过程

yizhihongxing

关于“深入理解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日

相关文章

  • Win10无法安装KB3140768补丁重启后还原该怎么办?

    Win10无法安装KB3140768补丁重启后还原该怎么办? 如果在Windows 10安装KB3140768补丁后遇到了问题,重启后系统出现异常,那么我们需要采取以下的步骤来还原系统: 进入安全模式 首先,我们需要让Windows 10进入安全模式,以便于能够进行后续的操作。 方法一:在Windows 启动时按下“Shift”键,按住不放。直到显示屏幕出现…

    other 2023年6月27日
    00
  • 告别DNS劫持,一文读懂DoH

    告别DNS劫持,一文读懂DoH 在使用网络的过程中,我们经常会遇到DNS劫持的问题,这种情况下,我们所访问的网站可能并非我们想要的网站,而是另一个被劫持的站点。为了解决这个问题,现有一项技术正在得到越来越多的关注和应用,那就是DNS over HTTPS(简称DoH)。 什么是DNS over HTTPS? DNS over HTTPS(DoH)是一种使用H…

    其他 2023年3月28日
    00
  • Golang协程池gopool设计与实现

    Golang协程池gopool设计与实现 协程池的概念 在 Golang 中,我们可以通过 Go 关键字,轻松创建协程(也称作 goroutine),但这种方式也会导致大量的协程被创建,如果这些协程的生命周期很短,那么会导致频繁的创建和销毁,带来较大的系统开销。此时,协程池就应运而生了。协程池的工作原理是,创建一些协程并将它们放到一个池子里面,并在需要使用协…

    other 2023年6月27日
    00
  • C++ 打开选择文件夹对话框选择目录的操作

    下面是详细的攻略: 目录选择框的使用方法 C++ 通过调用 Windows API 流程来打开选择文件夹对话框,选择和获取用户选择的目录信息。具体步骤如下: 通过 CoInitialize 函数来初始化 COM 库。 调用 Windows API 函数 CoCreateInstance 获取 IFileOpenDialog 的 Interface 指针,同时…

    other 2023年6月27日
    00
  • Android手机上同时安装正式包与测试包的方法

    Android手机上同时安装正式包与测试包的方法 有时候,我们需要在Android手机上同时安装正式包和测试包,以便进行测试和调试。以下是实现这一目标的两种方法: 1. 使用不同的应用ID 在Android应用中,应用ID是唯一标识一个应用的字符串。通过在正式包和测试包中使用不同的应用ID,我们可以在同一台设备上同时安装这两个应用。 示例: 正式包应用ID:…

    other 2023年10月12日
    00
  • tnsnames.ora配置注意(连接新的数据库)

    下面是“tnsnames.ora配置注意(连接新的数据库)”的完整攻略,包括tnsnames.ora的概念、配置方法、两个示例说明等方面。 tnsnames.ora的概念 tnsnames.ora是Oracle数据库客户端的配置文件之一,它包含了Oracle数据库的连接信息,例如数据库的名称、主机名、端口号等。在连接Oracle数据库时,客户端会读取tnsn…

    other 2023年5月5日
    00
  • 暗黑3 2.4圣教军远古散件轰炮流 词缀选择释疑

    暗黑3 2.4圣教军远古散件轰炮流 词缀选择释疑攻略 策略概述 圣教军远古散件轰炮流是暗黑3中一种常见的强力构筑之一,它充分利用了圣教军远古套装的增益效果,同时还能够选择合适的词缀来提升输出和生存能力。下面我们将详细解释这个构筑,并介绍如何选择合适的词缀。 构筑介绍 套装选择 这个构筑的核心是圣教军远古套装,包括以下六个物品: 圣教军之靴 圣教军之头 圣教军…

    other 2023年6月27日
    00
  • 流放之路3.2暴徒野蛮人火斧旋风斩BD介绍 低价通关BD攻略

    流放之路3.2暴徒野蛮人火斧旋风斩BD介绍: 低价通关BD攻略 一、前言 本文将详细介绍暴徒野蛮人火斧旋风斩BD的技能、装备、天赋以及升级推荐,并提供低价通关BD的攻略方法。 二、技能 1. 主技能 暴徒野蛮人的主技能是火斧旋风斩。要想尽可能快地清除敌人,建议玩家在游戏里配合其他技能使用该技能,效果十分出色。 2. 辅助技能 暴徒野蛮人的辅助技能包括:“战吼…

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