Class文件结构

本文详细介绍了JVM Class文件的结构,包括魔数、版本号、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合和属性表集合。重点讨论了常量池的组成和不同类型的常量,以及方法的访问标志和描述符。通过对Class文件的结构分析,有助于理解Java字节码的工作原理。
摘要由CSDN通过智能技术生成

JVM_类文件结构


class类文件的结构

​ Class文件是一组以8为字节为基础单位的二进制流,各数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8为字节进行存储。

​ Class中的两种数据类型:

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

图1

​ 无论是无符号数还是表,当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式,这时称这一系列连续的某一类型的数据为某一类型的集合。

类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count - 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attribute_count 1
attribute_info attributes attributes_count

采用如下代码进行分析

public class Hello {
   
  public static void main(String[] args) {
   
    System.out.println("hello");
  }
}

魔数与Class文件的版本

​ Class文件的头4个字节成为魔数(Magic Number),它的作用是确定这个文件是否是一个能被虚拟机接受的Class文件。

​ 使用魔数而不使用扩展名来进行识别,是要是基于安全的考虑,因为文件的后缀名可以随意改动。

​ 文件格式的制定者可以自定义的选择魔数值,只要这个值还没有被广泛的使用过同时不引起混淆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值