Java 字节码

字节码由10部分组成,依次是魔数、版本号、常量池、访问权限、类索引、父类索引、接口索引、字段表索引、方法、Attribute。如下图,按照顺序介绍每一部分。

 

 

 

整个Class文件本质上就是一张表,下表就是Class文件格式。Class中所有内容都在这些类型中定义了。

  • 注:表中的数据项,无论是顺序还是数量,甚至于数据存储的字节序(Byte Ordering,Class文件中字节序为Big-Endian)这样的细节,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。

 

 

1、魔数

0xcafebabe

魔数是文件类型的标识用4个字节表示,通过字节码的文件可以看出Java 字节码文件的魔数是CA  FE  BA  BE.

 

2、版本号

0x 00000033

版本号由minor_version(次版本号)major_version(主版本号)
组成各占两个字节,次版本号是前两个字节主版本号是后两个字节,所以该文件对应的次版本号是0000 主版本号是0034 十进制是52,从oracle
官网可知 52对应的为1.8 所以该文件版本为1.8.0

3、常量池

常量池中主要存储两大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。因为Java虚拟机在没有将类加载到内存的时候根本都没有分配内存地址,也就不存在对内存的操作,所以java虚拟机首先需要将类加载到虚拟机中,那么这个过程设计对类的定位(需要加载A包下的B类,不能加载到别的包下面的别的类中),所以需要通过全局限定名来判别唯一性。这就是为什么叫做全局,限定的意思,也就是唯一性。下图为常量池的项目类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考链接:https://www.jianshu.com/p/d8492e748c57

posted @   ONE_bit  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示