【JVM】详解 Class类文件的结构 - 指南

news/2025/11/23 16:08:35/文章来源:https://www.cnblogs.com/gccbuaa/p/19260745

目录

魔数与版本号

常量池

访问标志

类索引、父类索引和接口索引集合

字段表

方法表

属性表

Code属性

Exceptions属性


Class记录是以八字节为基础单位的二进制流,任何一个Class文件都对应着唯一的一个类或接口的定义信息。

Class文件格式采用“无符号数”和“”来记录数据:

  • 无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
  • 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名都习惯性地以“_info”结尾。

Class文件格式如图

魔数与版本号

Class文件的头四个字节为魔数(Magic Number),用来确定Class文件是否能被JVM接受。

紧跟着的4个字节就为版本号,主版本号(MajorVersion)就是第5和第6个字节是 次版本号(Minor Version),第7和第8个字节。版本号目的是让对应的JDK运行对应版本的Class文件,高版本的JDK能向下兼容以前版本的Class档案,但不能运行以后版本的Class文件。

常量池

常量池为表类型的数据,可以理解为Class文件的资源库

在版本号之后的就是常量池入口,常量池入口中放置了u2类型的数据,代表常量池容量计数值(constant_pool_count)。

一个表。常量池主要存放两大类常量:就是常量池中每一项常量都字面常量(Literal)符号引用(SymbolicReferences):

字面常量接近Java中的常量概念,如字符串,final修饰的常量值等。

符号引用则属于编译原理方面的概念,主要包括下面几类常量:

  • 被模块导出或者开放的包(Package)
  • 类和接口的全限定名(Fully Qualified Name)
  • 字段的名称和描述符(Descriptor)
  • 技巧的名称和描述符
  • 方法句柄和方法类型(Method Handle、Method Type、InvokeDynamic)
  • 动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)

访问标志

常量池之后就是访问表示,用来标记类和接口的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;若是是类的话,是否被声明为final等等

类索引、父类索引和接口索引集合

类索引(this_class)和父类索引(super_class)一个u2类型的数据,而就是都接口索引集合(interfaces)是一组u2类型的数据的集合。这三个数据类型决定了Class文件对应的类的继承关系。

字段表

字段表(field_info)用于描述接口或者类中声明的变量。结构如下图。

字段可以包括的修饰符有:字段的作用域(public、private、protected修饰符)​、类变量就是是实例变量还(static修饰符)​、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)​、可否被序列化(transient修饰符)​、字段数据类型(基本类型、对象、数组)​、字段名称

上述可以用bool类型的标志位来表示,通过放在access_flags字段修饰符在其中设置标志位。

跟随access_flags标志的是两项索引值:name_index和descriptor_index。它们都是对常量池项的引用,分别代表着字段的简单名称以及字段和方法的描述符

字段表集合中不会列出从父类或者父接口中继承而来的字段,但有可能出现原本Java代码之中不存在的字段,譬如在内部类中为了保持对外部类的访问性,编译器就会自动添加指向外部类实例的字段。

方法表

方法表的结构如同字段表一样,依次包括访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)。

在Java语言中,要重载(Overload)一个方法,除了要与原方法具有相同的简便名称之外,还要求必须拥有一个与原方法不同的特征签名特征签名是指一个方式中各个参数在常量池中的字段符号引用的集合。但如果两个方法简单名称、特征签名相同,返回值不同,也许可被视作重载的不同方法。

属性表

Class文件、字段表、方法表都可以携带自己的属性表集合以描述某些场景专有的信息。结构如下图。

Code属性

Java程序方法体里面的代码经过Javac编译器处理之后,最终变为字节码指令存储在Code属性内。

try-catch代码块中的异常通过异常表来处理。

Exceptions属性

Exceptions属性的作用是列举出方法中可能抛出的受查异常(Checked Excepitons),也就是方法描述时在throws关键字后面列举的异常。与异常表中处理的异常不同。

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

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

相关文章

实验3_CPP

任务1 源代码 button.hpp #pragma once#include <iostream> #include <string>class Button { public:Button(const std::string &label_);const std::string& get_label() const;void click();pr…

longchain4j 学习系列(4)-mcp调用

继续学习langchain4j,以下是langchain4j 调用MCP的示例: 1、添加pom依赖1 <dependency> 2 <groupId>dev.langchain4j</groupId> 3 <artifactId>langchain4j-mcp</artifactId>…

Java 学习路线可按「基础→进阶→实战→架构」四阶段推进

一、基础入门阶段(1-2个月) 核心目标:掌握Java语法和基本编程思维,能独立写简单程序。 核心知识点: 环境搭建(JDK安装、IDEA使用、环境变量配置) 基础语法(变量、数据类型、运算符、流程控制、数组) 面向对象…

Jetson Orin Nano super -2 烧录概念及必要性

一、什么是烧录?(核心定义) 烧录(又称 “写入”“刷写”)是指 将预先打包好的系统镜像、程序固件或驱动文件,通过专用工具和协议,写入嵌入式设备(如 Jetson 开发板、单片机)的存储介质(如 eMMC、SD 卡、NVMe…

blog搬迁

博客已经搬迁到https://langx1ng.github.io/处我要吃炸鸡

102302122许志安作业3

要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 代码如下: import os import requests from bs4 import BeautifulSoup from u…

iPhone14系列电池容量多少毫安

iPhone 14:3279mAhiPhone 14 Plus:4325mAhiPhone 14 Pro:3200mAhiPhone 14 Pro Max:4323mAh作为对比iPhone 13 / Pro 系列电池容量:iPhone 13 mini:2406mAhiPhone 13:3227mAhiPhone 13 Pro:3095mAhiPhone 13 P…

ipc linux

在 Linux 中,IPC(Inter-Process Communication,进程间通信) 是一种让不同进程之间进行数据交换和协作的机制。常见的 IPC 方式包括:1. 管道(Pipe)用途:用于父子进程之间传递数据。命令示例:cat file1 | grep …

读 《d2l:Chapter3. 线性神经网络 》随笔

讲一下Softmax回归 先说说自带mnist等库中的one-hot encoding 就是:一个向量,分量 (Row) == 类别 如: A、B、C 对应 \((1, 0, 0)\)、\((0, 1, 0)\)、\((0, 0, 1)\) 注:全连接层: 不同层使用线性连接 \(softmax\)运…

错排的

1.关键错排的理解 当1不放在k时 n个元素去掉k而k原来的位置可以看成1现在的位置(不能放的)变成了n-1个元素的错排 2.记忆化搜索 你后面要写函数啊 include <bits/stdc++.h> using namespace std; long long dp…

ipad学linux

iPad 并不是 Linux 系统,它是一款 iOS 设备,运行的是 Apple iOS 操作系统。因此,无法直接在 iPad 上运行 Linux。不过,你可以通过以下几种方式在 iPad 上使用 Linux:? 一、在 iPad 上运行 Linux(通过虚拟机或容…

iPadOS16有什么新功能

1、信息 App 为用户带来高效协作新方式2、一款协作类新 App 全面支持 Apple Pencil,让用户能在同一块灵活的画布上实时进行查看、分享和协作3、邮件 App 推出的全新搜索功能可得到相关性更高、更准确、更完整的搜索结…

ipad linux

您提到的 "iPad Linux" 实际上是 iPad 无法直接运行 Linux 的一个常见误解。iPad 是苹果公司生产的触摸屏设备,基于 iOS 系统,而 Linux 是一个开源操作系统,通常运行在桌面或服务器设备上。如果您是想在 …

ip 查看linux

ip 是一个用于查看和管理网络接口的命令行工具,常用于查看网络接口的状态、配置信息、路由表等。以下是 ip 命令的一些常见用法和示例:一、查看网络接口状态ip a显示所有网络接口的详细信息,包括接口名、IP 地址、子…

从上下文工程到组织知识管理重构——HRBP在人机协同时代的新使命 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:蓝色星球如何打造能与企业共同进化的灵活系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第七讲上自监督学习self-supervised learning-BERT

第七讲自监督学习self-supervised learning 常见的自监督模型大小:BERT<GPT<SWITCH 监督学习(supervised learning):有标签 自监督学习(self-supervised learning):没标签(属于无监督学习的一种类型)自…

内网渗透过程的多种代理搭建方法

在渗透的时候或多或少都会遇到各种不同的内网环境 因此我们拿下目标的外网资产后除了隐蔽自己外还有一个重要的步骤就是搭建内网代理,用外围机器作为跳板去攻击内网其他靶机 1.Neo-reGeorg reGeorg是一个老牌搭建内网…

男女生排列 女生的一定千万别忘了

进步就是我的代码模板化了不少 递推式再写一次include <bits/stdc++.h> using namespace std; long long dp[55]; long long f(int x) { if(dp[x]!=-1) return dp[x]; return dp[x]=f(x-4)+f(x-2)+f(x-1); } int…

2025年11月上海专业防水补漏推荐!Top5口碑公司实测,先检测后施工有保障

随着建筑防水需求的不断升级,市场对专业防水补漏服务的要求日益严苛。本榜单基于技术实力、服务范围、施工质量和客户口碑四大维度,结合行业数据与用户反馈,对上海地区主流防水补漏企业进行综合评测,为消费者和企业…