类加载(基本说明、流程图、类加载各个阶段完成的任务)

article/2025/9/26 15:53:15

目录

基本说明

类加载过程流程图

类加载各阶段完成的任务

加载阶段

​编辑

连接阶段-验证

连接阶段-准备

连接阶段-解析

Initialization(初始化)

 


类加载就是当字节码文件有了过后,进行下一步工作,不管是创建对象,还是干其他事情,都是有一个类加载器,把字节码加载到堆,并生成一个Class对象,同时在方法区生成类的二进制数据(元数据)。  


基本说明

举例说明:

静态加载,编译的时候,也就是还没运行的时候,加载相关的类,如果没有就会报错,这种静态加载,依赖性是比较强的。 

case "2" 里会去加载Person类,但是因为这里用的是反射,反射是动态加载,因为没有执行到这里来,不会真的去加载Person类

而case "1" 的加载类是静态加载,依赖性很强,在编译的时候就要把它加载进去,看他符不符合语法的规范,如果不符合,直接报错,或者Dog类写的有问题也会报错。

因为new Dog()是静态加载,因此必须编写Dog类

而Person类是动态加载,所以没有编写Person类也不会报错,只有当动态加载该类时,才会报错。

这时候我们在里面编写一个Dog类

这时候就不会进行报错了。

那么什么时候会导致动态加载报错?只有我们输入2的时候,走到这段代码的时候,它会发现根本没有Person,这个时候就会报出异常。

所以动态加载可以认为是一种延时加载,静态加载在编译的时候就已经在加载了。

这是我们输入2的时候,才走到这段代码,会发现没有Person,这时候就会报错。解决这种动态报错,就是我们需要写一个Person类

那么这时候找到Person类,用反射机制创建一个Person对象,然后这个Method对象用反射机制调用也是OK的

总结:

总的来说,静态加载就是在编译的时候就会加载相关的类,它会检查你的类是否正确,各方面会去检测。

而动态加载是执行到这一段的时候才会加载,如果运行的时候没有用到这个类,即使不存在也不会报错,这样就降低了一定的依赖性。


类加载过程流程图

第一步是先写源代码,源代码编译就得到字节码文件,字节码文件运行,运行的时候就会把字节码文件进行类加载,这里分成三个阶段。

第一个就是加载(Loading)

加载完的第二个阶段就是进入连接(Linking),连接里面又分成验证,准备,解析。

验证阶段主要是对文件进行安全的校验,比如说文件格式是否正确,再比如说元数据是否正确,字节码等是否正确,符号引用是否OK。


准备阶段主要是对静态变量进行分配内存,默认初始化,而且是针对静态变量而言。

解析阶段主要的功能是虚拟机会将常量池中的符号引用替换为直接引用。

下一步才会进行初始化,到这个阶段,才会真正的执行在类中去定义的Java代码,比如说静态代码块等。

当我们加载完成以后,在内存中会产生2个重要部分。一个是方法区,会把字节码,以二进制的形式保存起来。这个就是元数据,真正定义的方法,访问权限,变量详细信息都是在这里。同时在堆区生成字节码对应的数据结构,就是类的Class对象,这里面就是数据结构,是数据的访问入口。

类加载各阶段完成的任务

加载阶段

加载和连接阶段其实是由JVM机来控制的,我们是无法控制的,初始化是我们程序员可以指定的。

连接阶段-验证

连接阶段-准备

ClassLoad02.java

class A{//属性-成员变量-字段//分析类加载的链接阶段-准备 属性是如何处理的/*** 1. n1是个实例属性,不是静态变量,因此在准备阶段是不会分配内存的* 2. n2是个静态变量,这里就会分配内存,n2是默认初始化,这个默认初始化是0,还没到20,他在初始化这个阶段才会真正执行代码,但是内存确实分配了* 3. n3是个static final 是个常量,它和静态变量就不一样了,一但赋值就不变,所以n3在准备阶段就是30了,不是0.*/public int n1 = 10;public static int n2 = 20;public static final int n3 = 30;
}

A类里面写了3个属性,n1,n2,n3。
那么这3个属性在类的准备阶段是怎么处理的呢?

n1是个实例属性,不是静态变量,因此在准备阶段是不会分配内存的
n2是个静态变量,这里就会分配内存,n2是默认初始化,这个默认初始化是0,还没到20,他在初始化这个阶段才会真正执行代码,但是内存确实分配了
n3是个static final 是个常量,它和静态变量就不一样了,一但赋值就不变,所以n3在准备阶段就是30了,不是0。


连接阶段-解析

Initialization(初始化)

package com.godairo.reflection.classload_;/*** @author GodAiro* Creation Time: 2022/7/18 10:34.* 演示类加载-初始化*/
@SuppressWarnings({"all"})
public class ClassLoad3 {public static void main(String[] args) {/*** 分析* 1. 加载B类,,并生成B类的class对象* 2. 链接 num=0* 3. 初始化阶段* 	依次收集类中的所有静态变量的赋值动作和静态代码块中的语句,按顺序收集,并进行合并* 	clinit(){* 		System.out.println("B 静态代码块被执行");* 	  	num=300;* 	    num=100;	* 	}	* 	合并后:num=100,num=300就没什么意义了。	*/System.out.println(B.num); //这里需要注意的是 我们是B.num,没有去new一个B对象,所以构造器是不会执行的}
}class B{static{System.out.println("B 静态代码块被执行");num=300;}static int num=100;public B(){System.out.println("B() 构造器被执行");}}

看代码中注释


这是new一个B出来

System.out.println("=======new B()之后=======");
      B b = new B();
      System.out.println(B.num);

构造器也一起执行了。


http://chatgpt.dhexx.cn/article/8BTr7WbV.shtml

相关文章

什么是类的加载

一、什么是类的加载 java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料…

Windows下cmd命令—systeminfo

该命令是Windows中用于显示关于计算机及其操作系统的详细配置信息,包括操作系统配置、安全信息、产品 ID 和硬件属性,如 RAM、磁盘空间和网卡和补丁信息等。 例如:查看自己的计算机是32位还是64位 可以通过如下步骤: ①首先&…

SysInfoTools MS SQL Transaction Log Recovery 22.0

SysInfo DBF 修复工具专门用于修复由 dBase II IV、V Visual FoxPro、Clipper、dBXL、dBFast、CodeBase、MultiBase、Arago 生成的损坏、损坏和无法访问的 DBF 文件。从 SysInfoTools 下载最新和更复杂的基于 Windows 的应用程序 DBF 恢复实用程序,它可以一次性完美…

MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的,但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容,所以需要另外想办法编程获取,比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32…

系统信息:uname,sysinfo,gethostname,sysconf

且欲近寻彭泽宰,陶然共醉菊花怀。 文章目录 系统信息系统标识 unamesysinfo 函数gethostname 函数sysconf()函数 系统信息 系统标识 uname 系统调用 uname()用于获取有关当前操作系统内核的名称和信息,函数原型如下所示(可通过"man 2 …

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 使用Django,搭建sysinfo,Linux中,sysinfo是用来获取系统相关信息的结构体 本篇基于:https://github.com/hypersport/sysinfo#readme项目借鉴路径: https://gi…

SysInfo(电脑系统信息)0.0.0.1beta2

文件说明符 : D:\masm32\wmi\sysInfo\sysInfo0.0.0.1beta2.exe 属性 : A--- 数字签名:否 PE文件:是 语言 : 中文(简体,中国) 文件版本 : 0.0.0001 beta2 说明 : 电脑系统信息 版权 : PurpleEndurer 产品版本 : 0.0.0001 beta2 产品名称 : 电脑系统信息 公司名称 : P…

sysinfo函数、结构体使用

1&#xff0c;头文件&#xff1a; #include <sys/sysinfo.h>2&#xff0c;函数声明&#xff1a; int sysinfo(struct sysinfo *info);3&#xff0c;返回值&#xff1a; 成功返回0&#xff0c;错误返回-1&#xff1b; 4&#xff0c;sysinfo结构体名称 Linux 2.3.23(i38…

Linux中sysinfo的用法

sysinfo结构体 Linux中,可以用sysinfo来获取系统相关信息。 Linux中,sysinfo是用来获取系统相关信息的结构体。 函数声明和原型&#xff1a; #include <sys/sysinfo.h> int sysinfo(struct sysinfo *info); 在Linux中不同对版本结构体不一样 在Linux 2.3.16中&#…

sysinfo 函数

在linux系统中&#xff0c;我们可以使用sysinfo()获取一些系统统计信息。我们在终端命令行中输入“man 2 sysinfo”即可获取sysinfo()的详细信息&#xff0c;如下图所示。 从上图可以知道&#xff0c;使用uname需要包含头文件"#include <sys/sysinfo.h>" sysi…

natapp

简介 natapp是一个内网穿透工具&#xff0c;内网穿透也叫做内网映射&#xff0c;也叫“NAT穿透”&#xff0c;所谓内网穿透简单来说就是让外网能够访问内网&#xff0c;即把自己的电脑当服务器&#xff0c;让别人能够访问自己的电脑。 使用 1、注册一个账号&#xff0c;并且进…

WAP PUSH

PUSH &#xff08;WAP-PUSH&#xff09;又叫做服务信息或推入信息&#xff0c;是一种特殊格式的短信。 目录 基本简介 特点优势 系统框架 推送协议 推送服务方式 短消息网关简介 基于短信网关发送WAP PUSH wapPDU 模式 分析 良好前景 基本简介 特点优势 系统框架 推送协议 推送…

睡眠 应该用 a加权 c加权_时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用...

本应用实践平台为BigQuant人工智能量化平台 为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。…

【Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议)】

Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议) 需要IOS开发提供的信息 1.推送证书,.p8格式的文件 2.bundleId 3.keyId 4.teamId MAVEN依赖 <dependency><groupId>com.eatthepath</groupId><artifactId>pushy</artifactId>…

HTAP 简介

2019独角兽企业重金招聘Python工程师标准>>> HTAP的定义 数据库系统一般可以按照负载类型分成操作型数据库(Operational Support System)和决策型数据库(Decision Support System)。操作型数据库主要用于应对日常流水类业务,主要是面向消费者类的业务;决策型数…

爬取twitter数据--使用twint

最近因为实验验证的需要&#xff0c;想要爬取推特的数据&#xff0c;首先想到的是通过推特官方的开发者计划拿到key然后直接爬取&#xff0c;连接如下&#xff1a; twitter myapp 但是问题就在于&#xff0c;这玩意我用两个号申请都被拒绝了&#xff0c;据说是86的号码被拒就是…

tweepy抓取Twitter数据

Tweepy是Twitter官方提供的Python第三方开发库&#xff0c;简单好用易学高效&#xff01; 安装的流程很简单&#xff0c;如果你和我一样的win10_64bit用户&#xff0c;如果你配置了pip管理器&#xff0c;在你的终端里输入 >> pip install tweepy 就会自动安装好了 我们先…

【PWA学习】4. 使用 Push API 实现消息推送

引言 在接下来的内容里&#xff0c;我们会探究 PWA 中的另一个重要功能——消息推送与提醒(Push & Notification)。这个能力让我们可以从服务端向用户推送各类消息并引导用户触发相应交互 Web Push 效果 Push API 和 Notification API 其实是两个独立的技术&#xff0c;完全…

TWAMP 协议

使用标准协议测量IP网络性能始终是一项挑战。IP发明者曾作为TCP/IP协议套件的一部分提供了一些工具,如Internet控制消息协议(ICMP)Ping、Traceroute和用户数据报协议(UDP)Echo。但是,这些工具并不是为执行总体性能测试而准备的,而是设计用于简单排查IP网络故障。因此,企…

HTAP技术

传统业务采取隔天隔天将数据抽取到OLAP的方式&#xff0c;带来了两个问题 1&#xff0c; 报表往往需要隔天才能出来&#xff0c;无法满足业务需要&#xff1b; 2&#xff0c;带来了多副本的问题&#xff1b; OLTP里面至少三个副本&#xff1b; OLAP里面又至少3个副本&#xf…