Java类加载基本过程详细介绍

yizhihongxing

Java类加载是指将class文件从磁盘加载到内存中,并将其转换为Java虚拟机(JVM)内部的数据结构,以便在程序运行时使用。Java类加载包括三个步骤:加载、连接和初始化。下面详细介绍每个步骤的具体过程。

加载

类加载的第一步是加载,其主要目的是通过类的全名查找该类的二进制字节流。在Java中,实现类的加载主要有两种方式:

  1. 类路径(ClassPath)加载

    在Java中,类路径(ClassPath)指定了类文件的搜索路径。类加载器根据类路径来搜索类,当需要加载某个类时,它会从类路径下搜索以该类命名的.class文件,并将这个文件的字节流读入内存,然后创建一个与之对应的Class对象来表示这个类。

  2. 动态加载

    动态加载是指通过Class.forName()方法或ClassLoader.loadClass()方法,动态地从指定的字节码文件中加载类。动态加载通常用于创建 插件系统,实现类似于Hibernate等ORM框架的功能。

连接

类加载的第二步是连接,包括验证、准备和解析三个阶段。

  1. 验证 阶段

    在验证阶段,类加载器会进行字节码验证,以确保.class文件的字节流符合JVM规范,并且不包含任何危险代码。如果验证失败,则会抛出异常,JVM将不允许该类的加载。

  2. 准备 阶段

    在准备阶段,JVM会为加载的每个类创建Class对象,并为这个对象分配内存空间,包括为非static变量分配内存空间和赋初始值(如0或null)。

  3. 解析 阶段

    在解析阶段,JVM会将类和接口中的符号引用解析为直接引用。简单的说,就是将类中用到的其他类的名称转换为可以直接使用的、已经加载过的类的引用。如果解析失败,则会抛出异常。

初始化

类加载的最后一步是初始化。在初始化阶段,JVM会执行类的静态初始化器(static块),这些静态初始化器与类的单独实例无关,只针对整个类。示例代码如下:

public class Demo {
    static int a = 1;
    static int b;

    static {
        b = 2;
        System.out.println("a=" + a + ", b=" + b);
    }

    public static void main(String[] args) {
        System.out.println("a=" + a + ", b=" + b);
    }
}

输出结果为:

a=1, b=2
a=1, b=2

可以看到,在初始化阶段,JVM会按照声明的顺序依次执行静态初始化器中的代码,最终输出" a=1, b=2"。这个过程只会执行一次,且在任意静态变量被访问时都会自动触发。

另外一个示例代码如下:

public class A {
    static {
        System.out.println("A");
    }
}

public class B extends A {
    static {
        System.out.println("B");
    }
}

public class C extends B {
    static {
        System.out.println("C");
    }
}

public class Demo {
    public static void main(String[] args) {
        C c = new C();
    }
}

输出结果为:

A
B
C

这个示例代码中,类C继承于类B,类B又继续于类A。在执行main函数时,首先会JVM会初始化类C,然后初始化类B,并在类B初始化的过程中,顺便也将类A初始化了。可以看到,类的初始化是具有继承性的。

获得了类的Class对象后,就可以创建实例对象,调用对象的方法了。

总结:

Java类加载的过程,包括三个步骤:加载、连接和初始化。加载阶段主要是将类的.class文件加载到内存中,连接阶段包括验证、准备和解析三个阶段,目的是将.class文件中的代码转换为JVM可以理解的形式。初始化阶段则是执行类的静态初始化器。在项目的开发中,对于相对复杂的Java应用程序,需好好理解类的加载过程,更好地掌握应用程序的控制权。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java类加载基本过程详细介绍 - Python技术站

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

相关文章

  • 深入理解IOS控件布局之Masonry布局框架

    深入理解iOS控件布局之Masonry布局框架 什么是Masonry Masonry是iOS开发中一款优秀的自动布局框架,简化了AutoLayout布局时繁琐的约束设置过程,提高了开发效率。Masonry使用链式语法让代码易于编写和理解,支持纯代码和XIB/storyboard两种方式进行布局设置。 安装Masonry 使用CocoaPods安装Masonr…

    other 2023年6月26日
    00
  • excel2019表格怎么快速生成用户名与密码?

    生成用户名和密码是Excel中一个常见且实用的操作,下面是详细的攻略: 步骤一:打开Excel工作表并输入数据 首先,我们需要打开Excel工作表,并准备好需要生成的用户名和密码数据。这些数据可以手动输入,也可以从其他来源导入。在这个示例中,我们将使用以下的数据: 姓名 邮箱 张三 zhangsan@abc.com 李四 lisi@abc.com 王五 wa…

    other 2023年6月27日
    00
  • asp 关键词高亮显示(不区分大小写)

    当在ASP中需要对关键词进行高亮显示时,可以使用以下步骤来实现(不区分大小写): 首先,获取要显示的文本内容和关键词。假设我们有一个字符串变量text,其中包含要显示的文本内容,以及一个字符串变量keyword,其中包含要高亮显示的关键词。 使用正则表达式来匹配并替换关键词。在ASP中,可以使用RegExp对象来进行正则表达式操作。创建一个RegExp对象,…

    other 2023年8月18日
    00
  • Linux下搭建HTTP服务器完成图片显示功能

    下面是在Linux下搭建HTTP服务器完成图片显示的完整攻略。 步骤一:安装HTTP服务器 在Linux系统中,常用的HTTP服务器有Apache、Nginx等,在此我们以安装Apache为例。 打开终端,输入以下命令安装Apache: sudo apt-get update sudo apt-get install apache2 安装完成后,输入以下命令…

    other 2023年6月27日
    00
  • ocam怎么添加鼠标右键单击效果 ocam添加鼠标右键单击效果教程

    添加鼠标右键单击效果其实是给OCam添加录制区域选框功能。具体的实现过程需要进行以下几个步骤: 步骤一:下载并安装AutoHotkey AutoHotkey是一款Windows自动化脚本语言,可用于编写各种脚本来自动化各种操作。我们可以借助它来实现鼠标右键的单击效果。 下载AutoHotkey安装程序并完成安装。 步骤二:创建脚本文件 在桌面上新建一个空白文…

    other 2023年6月27日
    00
  • python脚本之三种运行方式 你会几个?

    当然,我可以为您提供有关“Python脚本之三种运行方式”的完整攻略,以下是详细说明: 什么是Python脚本? Python脚本是一种本文件,其中包含Python代码。Python脚本可以在Python解释器中运行,以执行其中的代码。 Python脚本的三种运行 Python脚本有三种运行方式,分别是: 在Python解释器中直接运行 在命令行中运行 在集…

    other 2023年5月7日
    00
  • 魔兽世界wlk怀旧服毁灭术堆什么属性 毁灭术属性优先级选择攻略

    魔兽世界wlk怀旧服毁灭术堆什么属性 毁灭术属性优先级选择攻略 简介 在WOW Classic怀旧服中,毁灭术是术士职业的一种重要输出技能。那么在玩WOW Wlk怀旧服时,我们该如何选择适合的属性来提升毁灭术的输出效果呢? 在本篇攻略中,我们将详细讲解影响毁灭术输出的属性,并给出毁灭术属性优先级的选择攻略,帮助你在游戏中提升毁灭术的输出效果。 影响毁灭术输出…

    other 2023年6月27日
    00
  • Linux文件服务器实战详解(系统用户)

    下面是“Linux文件服务器实战详解(系统用户)”的完整攻略。 一、概述 本文将介绍如何使用Linux搭建一个文件服务器,以便于我们在不同的终端设备上进行文件的共享与访问。此外,还将介绍如何使用Linux系统用户来进行身份验证,保证文件的安全性。 二、步骤 1. 安装Samba服务 Samba是一款流行的文件共享服务,我们可以使用以下命令来安装它: sudo…

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