JVM字节码文件结构

Class文件结构

class文件是二进制文件,这里要介绍的是这个二级制文件的结构。

思考:一个java文件编译成class文件,如果要描述一个java文件,需要哪些信息呢?

  • 基本信息:类名、父类、实现哪些接口、方法个数、每个方法名称和参数和访问属性、每个方法的内容、属性个数、属性名称和类型和访问属性、构造方法。
  • 编译信息:编译的JDK版本

Class文件结构参照表

  • 常量池表长度 = constant_pool_count(常量个数) - 1, 原因是 常量池第0个位置被JVM占用了表示为null

Class文件示例分析

.java文件

public class TulingByteCode {private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}

先将其编译成class文件:javac TulingByteCode.java

再将.class文件反编译:javap -v TulingByteCode.class

.class文件反编译

Classfile /Users/xxxx/Documents/xxx/xxxx/app/test/src/test/java/com/xxxx/xxxxx/TulingByteCode.classLast modified 2025-8-14; size 450 bytesMD5 checksum 9e4f059c2aa6ec60f9c7f0093b58a2f6Compiled from "TulingByteCode.java"
public class com.xxxxx.xxxxxxx.TulingByteCodeminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #4.#17         // java/lang/Object."<init>":()V#2 = Fieldref           #3.#18         // com/xxxx/xxxxx/TulingByteCode.userName:Ljava/lang/String;#3 = Class              #19            // com/xxxxx/xxxxxxx/TulingByteCode#4 = Class              #20            // java/lang/Object#5 = Utf8               userName#6 = Utf8               Ljava/lang/String;#7 = Utf8               <init>#8 = Utf8               ()V#9 = Utf8               Code#10 = Utf8               LineNumberTable#11 = Utf8               getUserName#12 = Utf8               ()Ljava/lang/String;#13 = Utf8               setUserName#14 = Utf8               (Ljava/lang/String;)V#15 = Utf8               SourceFile#16 = Utf8               TulingByteCode.java#17 = NameAndType        #7:#8          // "<init>":()V#18 = NameAndType        #5:#6          // userName:Ljava/lang/String;#19 = Utf8               com/xxxx/xxxxxx/TulingByteCode#20 = Utf8               java/lang/Object
{public com.xxxxx.xxxxxx.TulingByteCode();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 7: 0public java.lang.String getUserName();descriptor: ()Ljava/lang/String;flags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield      #2                  // Field userName:Ljava/lang/String;4: areturnLineNumberTable:line 11: 0public void setUserName(java.lang.String);descriptor: (Ljava/lang/String;)Vflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: aload_01: aload_12: putfield      #2                  // Field userName:Ljava/lang/String;5: returnLineNumberTable:line 15: 0line 16: 5
}
SourceFile: "TulingByteCode.java"

.class文件二进制

部分截图如下:

.class文件分析

1. 常量池入口

第一行 00 09

常量池入口(常量个数),占用二个字节,表示常量池中的个数=00 19 (25)-1=24个, 为啥需要-1,因为常量池中的第0个位置被JVM占用了表示为null ,所以编译出来的常量池索引是从1开始的.

对应的.class反编译结果中,常量池有24个,索引从1开始。

2. 常量池类

JVM数据类型

        JVM表示数据类型时,表示数据类型时有自己的规范。

        基本参数类型和void类型都是用一个大写的字符来表示,对象类型是通过一个大写L加全类名表示,这么做的好处就是在保证jvm能读懂class文件的情况下尽量的压缩class文件体积.

基本数据类型表示:

  • B---->byte
  • C---->char
  • D---->double
  • F----->float
  • I------>int
  • J------>long
  • S------>short
  • Z------>boolean
  • V------->void

对象类型:

  • String------>Ljava/lang/String;(后面有一个分号)

对于数组类型: 每一个唯独都是用一个前置 [ 来表示比如:

  • int[] ------>[ I,
  • String [][]------>[[Ljava.lang.String;

用描述符来描述方法,先参数列表,后返回值的格式,参数列表按照严格的顺序放在()中。

比如源码 String getUserInfoByIdAndName(int id,String name) 的方法描述符号(I,Ljava/lang/String;)Ljava/lang/String;

 常量池类型分类

u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数。

规范性的数据,暂时不全列出来了, 举个栗子吧

常量项目类型描述
CONSTANT_Utf8_infotagu1值为1
lengthu2UTF-8编码的字符串占用的字节数
bytesu1长度为length的UTF-8编码的字符串
CONSTANT_Methodref_infotagu1值为10
class_indexu2指向声明方法的类描述符CONSTANT_Class_info的索引项
name_and_type_indexu2指向名称和类型描述符CONSTANT_NameAndType 的索引项

分析常量池的第一个常量:

  • class_index 00 04   : 二个字节表示的是是方法所在类 指向常量池的索引位置为#4,然后我们发现#4的常量类型是Class,也是符号引用类型,指向常量池#24的位置,而#24是的常量池类型是字面量值为:java/lang/Object
  • name_and_type_index 00 15:二个字节表示是方法的描述符,指向常量池索引#21的位置,我们发现#21的常量类型是"NameAndType类型"属于引用类型,指向常量池的#7 #8位置,#7常量类型是UTF-8类型属于字面量值为:<init>  构造方法, #8常量也是UTF-8类型的字面量值为:()V
  • 所以常量池中的第一个常量是:java/lang/Object."<init>":()V

常量池可以看作java class类的一个资源仓库(比如Java类定的方法和变量信息),我们后面的方法 类的信息的描述信息都是通过索引去常量池中获取。

常量池中主要存放两种常量,一种是字面量 ,一种是符号引用。

编译的时候确认局部变量表的长度

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

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

相关文章

11.web api 2

5. 操作元素属性 5.1操作元素常用属性 &#xff1a;通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等5.2 操作元素样式属性 &#xff1a;通过 JS 设置/修改标签元素的样式属性。使用 className 有什么好处&a…

java中数组和list的区别是什么?

在Java中&#xff0c;数组&#xff08;Array&#xff09;和List&#xff08;通常指java.util.List接口的实现类&#xff0c;如ArrayList、LinkedList&#xff09;是两种常用的容器&#xff0c;但它们在设计、功能和使用场景上有显著区别。以下从核心特性、使用方式等方面详细对…

Python爬取推特(X)的各种数据

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

Oracle数据库文件管理与空间问题解决指南

在Oracle数据库运维中&#xff0c;表空间、数据文件及相关日志文件的管理是保障数据库稳定运行的核心环节。本文将系统梳理表空间与数据文件的调整、关键文件的移动、自动扩展配置&#xff0c;以及常见空间不足错误的排查解决方法&#xff0c;为数据库管理员提供全面参考。 一、…

华为实验综合小练习

描述&#xff1a; 1 内网有A、B、C 三个部门。所在网段如图所示。 2 内网服务器配置静态IP,网关192.168.100.1。 3 sw1和R1之间使用vlan200 192.168.200.0/30 互联。 4 R1向运营商申请企业宽带并申请了5个公网IP&#xff1a;200.1.1.1-.5子网掩码 255.255.255.248&#xff0c;网…

Flink面试题及详细答案100道(1-20)- 基础概念与架构

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

爬虫逆向之滑块验证码加密分析(轨迹和坐标)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的。否则由此产生的一切后果均与作者无关&#xff01;在爬虫开发过程中&#xff0c;滑块验证码常常成为我们获取数据的一大阻碍。而滑块验证码的加密方式多种多样&#xff0c;其中轨迹加密和坐标加密是比较常见的…

微信小程序实现导航至目的地

本人做的导航页面相关功能和效果的代码 javascript相关 Page({data: {markers: [],latitude: , // 中心点坐标longitude: ,FIXED_LAT: 31.2304, // 1. 写死的目标点坐标, 示例&#xff1a;上海人民广场FIXED_LNG: 121.4737},onLoad: function () {// 如果要显示地图可以看onLo…

中国科学社简史

中国科学社简史中国科学社&#xff0c;作为中国近代史上第一个民间综合性科学团体&#xff0c;为中国现代科学文化事业的发展做出了卓越贡献。其历程不仅见证了中国科学从萌芽到蓬勃发展的转变&#xff0c;还反映了中国科学体制化的艰难探索与辉煌成就。中国科学社的起源可追溯…

若尔当型,Jordon Form

文章目录一、相似二、若尔当型1.1 认识若尔当型1.2 凯莱-哈密顿定理 (Cayley-Hamilton Theorem)一、相似 Every matrix CB−1ABC B^{-1}ABCB−1AB has the same eigenvalues as A. These C’s are similar to A. 任意一个矩阵C&#xff0c;满足 CB−1ABC B^{-1}ABCB−1AB 都和…

解决uni-app微信小程序编译报错:unexpected character `1`

问题原因在uni-app微信小程序开发中&#xff0c;当template模板中包含英文符号<或>时&#xff0c;微信小程序的编译器会将这些符号误认为是HTML标签的开闭符号&#xff0c;从而导致类似unexpected character 1的编译错误。错误示例<view class"plan-bmi">…

[Linux] RAID存储技术

目录 RAID实现方式 RAID 0 RAID 1 RAID 5 RAID 10 管理RAID0 创建RAID 查看RAID 格式化和挂载 删除RAID 管理RAID1 创建RAID 查看RAID 格式化和挂载 增加热备盘 模拟故障 删除故障磁盘 删除RAID 管理RAID5 创建RAID 查看RAID md5设备划分分区 RAID实现方…

程序设计|C语言教学——C语言基础4:进阶

一、预处理指令预处理指令在编译前执行&#xff0c;除了#include&#xff0c;还有以下常用指令&#xff1a;1. #define 宏定义无参宏&#xff1a;定义常量或代码片段&#xff0c;编译时直接替换&#xff08;无类型检查&#xff09;。#define PI 3.1415926 // 定义常量 #define…

数据结构之heap算法

文章目录前言1. heap结构概述2. push_heap3. pop_heap4. sort_heap5. make_heap前言 heap这种数据结构&#xff0c;允许用户以任何次序将任何数据放入该结构中&#xff0c;但是最后取出数据的时候一定是权值最高&#xff08;或者最低&#xff09;的元素。主要和实现有关&#x…

MCU 软件断点调试注意事项!!!

——为什么调试器会在运行中改我的Flash程序&#xff1f;调试单片机时&#xff0c;很多人都有这样的疑问&#xff1a;明明我在调试前刷进去的固件是好的&#xff0c;为什么加了一个断点之后&#xff0c;调试器居然去改了 Flash&#xff1f; 如果我拔掉调试器&#xff0c;这个固…

启发式合并 + 莫队 恋恋的心跳大冒险

题目来源&#xff1a;2025 Wuhan University of Technology Programming Contest 比赛链接&#xff1a;Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces 题目大意&#xff1a; Solution&#xff1a; 首先肯定要预处理出以每个节点为起点…

JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue

ConcurrentCircularArrayQueue ConcurrentCircularArrayQueue 是一个抽象类&#xff0c;它为基于数组的并发循环队列提供了基础功能。从其命名可以看出几个关键特性&#xff1a;​​Concurrent​​&#xff1a;常指无锁并发。​​Circular Array​​&#xff1a;内部使用循环数…

力扣(LeetCode) ——622. 设计循环队列(C语言)

题目&#xff1a;622. 设计循环队列示例1&#xff1a; MyCircularQueue circularQueue new MyCircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回 true circularQueue.enQueue(3); // 返回 true circularQueue.…

在JVM跑JavaScript脚本 | Oracle GraalJS 简介与实践

这是2024年初的 GraalVM 系列博文&#xff0c;当时写了大纲&#xff0c;知道一年半后的现在才得以完成发布&#x1f604; 1、概述 实话说&#xff0c;标题的场景为小众需求&#xff0c;日常开发基本用不到&#xff0c;我是最近在做一个低代码轮子玩具 app-meta 需要实现 FaaS&…

基于 EC 数据与大模型技术实现天气预报:从数据到上线的全栈方法

1. 先校准“EC 数据”与“AI 预报”的语境 EC 数据家族(常用) IFS/HRES:确定性全球模式,水平分辨率约 9 km,常用预报范围 10 天; IFS/ENS:51 成员集合预报,提供 15 天概率信息; ERA5:再分析数据,小时级、0.25,可追溯至 1940 年,用作训练/评测黄金基准。 AI 预报…