【注释和反射】类加载的过程

news2024/11/17 23:55:49

继上一篇博客【注释和反射】获取class类实例的方法-CSDN博客

目录

三、类加载的过程

例子


三、类加载的过程

在Java虚拟机(JVM)中,类加载是一个将类的字节码文件从文件系统或其他来源加载到JVM的内存中,并将其转换为类或接口的过程。类加载的过程主要可以分为三个步骤:加载(Loading)、链接(Linking)和初始化(Initialization)。

(1)加载(Loading):

加载是类加载过程的第一步,主要由类加载器完成。类加载器负责从文件系统、网络或其他来源读取类的字节码文件,并将其加载到JVM的内存中。加载过程主要完成以下三件事:

  1. 通过类的全限定名获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

Java提供了三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)。这些类加载器之间存在父子关系,但这里的父子关系并非继承关系,而是包含关系。

(2)链接(Linking):

链接过程可以细分为验证(Verification)、准备(Preparation)和解析(Resolution)三个阶段。

  1. 验证:验证阶段主要是为了确保加载的类文件信息符合JVM规范,不会危害虚拟机自身的安全。
    1. 验证的内容包括文件格式、元数据、字节码和符号引用等。
  2. 准备:准备阶段是为类的静态变量(static变量)分配内存,并设置默认的初始值。这些内存都将在方法区中进行分配。
    1. 需要注意的是,这里所说的初始值通常情况下是数据类型默认的零值,而不是被显式赋值。
  3. 解析:解析阶段是将常量池内的符号引用替换为直接引用的过程。
    1. 符号引用以一组符号来描述所引用的目标,而直接引用则是直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。

(3)初始化(Initialization):

初始化阶段是类加载过程的最后一步,主要完成类的静态变量的初始化工作。静态变量的初始化是由类构造器<clinit>()方法完成的。这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

初始化阶段,只有当类被主动使用时才会触发。主动使用的情况包括:创建类的实例、访问某个类或接口的静态变量、调用类的静态方法、反射(如Class.forName())、初始化一个类的子类(会首先初始化子类的父类)、Java虚拟机启动时被标明为启动类的类(Java Test)、JDK 7开始提供的动态语言支持等。

需要注意的是,类的加载过程必须按照顺序开始,但并非必须按照顺序完成。因为链接阶段中的某些过程(如解析)可能需要在初始化阶段中根据实际运行情况才能确定。此外,JVM规范并没有规定解析阶段一定要在初始化之前完成,只要求了在类和接口被使用前完成解析。

例子

public class Test02 {
  public static void main(String[] args) {
    A a = new A();
    System.out.println(A.m);
  }
}


class A{
  static {
    System.out.println("A类的静态代码块初始化");
    m = 300;
  }

  static int m = 100;

  public A(){
    System.out.println("A类的无参构造初始化");
  }
}

当运行Test02类的main方法时,以下是详细步骤:

  1. 加载Test02:因为Test02包含main方法,它是程序的入口点,所以JVM首先加载Test02类。但是Test02类本身没有静态变量和静态代码块需要初始化,所以这一步几乎没什么要做的。

  2. 执行main方法:在main方法中,首先创建A类的一个实例a

  3. 加载A:为了创建A的实例,JVM需要加载A类。在加载类的过程中,JVM会执行以下操作:

    • 分配内存给A类的静态变量。
    • 初始化A类的静态变量。在这个过程中,首先会执行静态代码块,然后按照声明的顺序初始化静态变量
  4. 执行静态代码块:在静态代码块中,输出了“A类的静态代码块初始化”,然后将m赋值为300。但是,这里有一个关键的陷阱。

  5. 初始化静态变量m:紧接在静态代码块执行之后,静态变量m被初始化为100。这个赋值操作实际上覆盖了静态代码块中的赋值,因为静态变量的初始化语句(static int m = 100;)在静态代码块之后执行。

  6. 创建A的实例:现在,A类已经加载并初始化,可以创建其实例了。调用A的无参构造函数,输出“A类的无参构造初始化”。

  7. 输出m的值:最后,main方法中System.out.println(A.m);输出静态变量m的当前值,由于m最终被赋值为100,所以输出结果是100。

综上所述,程序的输出结果为:

A类的静态代码块初始化
A类的无参构造初始化
100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SEW减速机参数查询 2-2 实践

首先说说结论&#xff1a;在不和SEW官方取得沟通之前&#xff0c;你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数&#xff1a;比如轴的模数和齿数&#xff0c;轴承的参数。我在周一耗费了一个上午&#xff0c;最终和SEW方面确认后才知晓相关技术参数需要凭借销…

LeetCode 1052. 爱生气的书店老板

题目链接 https://leetcode.cn/problems/grumpy-bookstore-owner/description/?envTypedaily-question&envId2024-04-23 先把最初的满意人数累加算出来&#xff0c;然后使用滑动窗口来模拟连续 minutes分钟不生气&#xff0c;计算不生气minutes分钟最大的满意数 class S…

2010-2023年“国家级大数据综合试验区”试点城市DID匹配数据

2010-2023年国家级大数据综合试验区试点城市DID匹配数据 1、时间&#xff1a;2010-2023年 2、来源&#xff1a;国家发展改革委、工业和信息化部、ZY网信办发函批复的试验区 3、指标&#xff1a;行政区划代码、年份、所属省份、地区、国家级大数据综合试验区、最早设立年份 …

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在理解和生成人类语言方面取得了显著的飞跃&#xff0c;这些进步不仅推动了语言学和计算机编程的发展&#xff0c;还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM&#xff0c;它们通过吸收海量文本…

面试遇到算法题:实现LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 这是一道大厂面试高频出现的算法题&#xff0c;难度为⭐️⭐️⭐️&#xff0c;属于中等&#xff0c;老铁们来一起看看这个题该怎么解&#xff1f; 1. 原题再现 没有废话&#xff0c;翠花&#xff0c;上酸菜&…

LeetCode:2385. 感染二叉树需要的总时间(DFS Java)

目录 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第…

Simulink从0搭建模型03-Enabled Subsystem 使能子系统

参考博客 b站视频 【Simulink 0基础入门教程 P4 使能子系统 Enabled Subsystem 的使用介绍】 个人听了这个博主的视频风格觉得很适合我入门学习&#xff0c;讲得很清楚。 另外&#xff0c;视频里面教得很详细了&#xff0c;我也不会再详细写怎么打开创建等步骤&#xff0c;跟着…

QT中对于QPushButton样式的调整

文章目录 前言1.QPushButton1.1 新建项目导入资源1.2 添加Push Button并定义样式1.3 调整样式1.4 实际需求情况1.5 背景色和边框 2. 一些概念理解2.1 图片2.2 边距 总结 前言 前段时间在调软件的样式&#xff0c;学到了些新的东西&#xff0c;也碰到了些问题&#xff0c;这里做…

电脑遗失d3dx9_43.dll文件会给电脑带来什么问题,有哪些方法可以解决丢失d3dx9_43.dll文件的办法

电脑遗失了d3dx9_43.dll文件&#xff0c;可能会引发一系列麻烦的后果。那么&#xff0c;针对这种情况&#xff0c;我们应该采取哪些方法来修复丢失的d3dx9_43.dll文件呢&#xff1f;下面将介绍几种解决d3dx9_43.dll文件丢失问题的有效方法。 对d3dx9_43.dll文件的简要介绍 d3d…

Flutter 中优雅切换应用主题的组件

Flutter 中优雅切换应用主题的组件 视频 https://youtu.be/L–XLpc452I https://www.bilibili.com/video/BV1wD421n75p/ 前言 原文 https://ducafecat.com/blog/flutter-app-theme-switch Adaptive Theme 这个组件通过包裹 MaterialApp 的方式整体管理 theme 主题&#xff0…

Linux中Ctrl+C和Ctrl+Z的区别_实战讲解(超详细)

1、CtrlC和CtrlZ的区别&#xff1a; CtrlZ&#xff1a;暂停进程 即挂起进程 暂停当前进程并将其放到后台。可以在后续恢复执行。 暂停的进程仍然占用系统内存 CtrlC&#xff1a;终止进程 终止进程后&#xff0c;程序代码占用的内存会释放掉 2、实战讲解 跑人工智能代码的时候…

Ts类型体操详讲 之 extends infer (下)

目录 1、函数 &#xff08;1&#xff09;提取参数类型 &#xff08;2&#xff09;提取返回值类型 2、构造器 &#xff08;1&#xff09;提取构造器返回值 &#xff08;2&#xff09;提取构造器参数类型 3、索引类型 本章我们继续上节的内容继续&#xff0c;展示我们对ex…

day12 过一遍Nestjs框架(java转ts全栈/3R教室)

介绍&#xff1a;NestJS是Ts技术栈的后端框架&#xff0c;相当于Java中的springboot。 学习方法&#xff1a;与java技术体系进行对比学习。学习目标&#xff1a;nest相关知识也是挺多&#xff0c;但对比学spring的时候&#xff0c;大部分在项目生产中都是套路化的&#xff0c;大…

Qt开发(二)打包发布

注意qt6生成的exe不能再win7&#xff08;包含win7&#xff09;以下运行 1、编译程序 编译程序不演示 2、找到exe文件 在这个路径下找到该exe文件 3、打包 新建一个文件夹 将exe放在该文件夹下除了exe开始这里面没有其他文件 找到安装目录下 在cmd中运行 把这个文件和编…

html2Canvas截图包含滚动条解决思路

概况描述 在项目中使用html2Canvas进行截图时发现无法截取滚动条部分&#xff0c;前端是使用vue2的版本&#xff0c;网上找了很多方式都没效果&#xff0c;冷静思考后&#xff0c;给出解决办法。 解决思路 当我们截取的div容器的宽和高与内部的子容器div的宽和高不一样时&am…

江开2024年春《大学英语(B)(2) 060052》过程性考核作业4参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1阅读Passage One&#xff0c;回答C-1C-4个问题。请…

七星创客新零售系统:颠覆性商业模式的崛起

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是七星创客新零售系统&#xff1f; 随着经济的快速发展和科技的不断进步&#xff0c;商业模式的革新成为了企业发展的关键。在这个新旧动能转换、…

【2023】springboot通过阿里云oss进行文件单个批量文件上传下载

SpringBoot整合阿里OSS实现上传下载 目录&#x1f4bb; 前言一、介绍二、阿里云添加oss1、进入oss目录2、创建bucket3、测试上传下载4、创建AccessKey管理账号 三、依赖以及配置1、依赖2、yml3、Config类4、OSSUtil 工具类 四、controller五、测试1、测试上传2、测试删除 前言 …

牛客 题解

文章目录 day4_17**BC149** **简写单词**思路&#xff1a;模拟代码&#xff1a; dd爱框框思路&#xff1a;滑动窗口&#xff08;同向双指针&#xff09;代码&#xff1a; 除2&#xff01;思路&#xff1a;模拟贪心堆代码&#xff1a; day4_17 BC149 简写单词 https://www.now…

stm32F407-PS手柄代码,20240424

一、硬件接线 手柄接收器—stm32板子 GND—GND VCC—5V DAT–F3 CMD–F5 CS–F6 CLK–F4 二、PStwo.h #ifndef __PSTWO_H #define __PSTWO_H//F3 F5 F6 F4 F10 // #include "delay.h" #include "sys.h"#define DI PFin(3) //PB12 输入#defin…