jvm虚拟机-4 class文件方法表集合

本文围绕Java Class文件展开,介绍了方法表集合的构造,包括访问标志、名称索引等项,还提到Java方法重载规则及class文件中方法共存情况。同时进行了字段字节码分析,通过javap分析常量池,解读方法表部分各项数值含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.方法表集合

        class文件顺序是:魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引和接口索引集合,字段表集合,本章节为方法表集合。

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

  方法表结构:  

类型名称数量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

  方法访问标志:

标志名称标志值含义
ACC_PUBLIC0x00 01方法是否为public
ACC_PRIVATE0x00 02方法是否为private
ACC_PROTECTED0x00 04方法是否为protected
ACC_STATIC0x00 08方法是否为static
ACC_FINAL0x00 10方法是否为final
ACC_SYHCHRONRIZED0x00 20方法是否为synchronized
ACC_BRIDGE0x00 40方法是否是有编译器产生的方法
ACC_VARARGS0x00 80方法是否接受参数
ACC_NATIVE0x01 00方法是否为native
ACC_ABSTRACT0x04 00方法是否为abstract
ACC_STRICTFP0x08 00方法是否为strictfp
ACC_SYNTHETIC0x10 00方法是否是有编译器自动产生的

  方法里的Java代码,经过编译器编译成字节码指令后,存放在方法属性表集合中一个名为"Code"的属性里面,属性表作为calss文件格式中最具扩展的一种数据项目.

       在Java语言中,要重载一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名中,因此Java语言里面是无法仅仅靠返回值的不同来堆一个已有方法进行重载的.但是在class文件格式中,特征签名的范围更大一些,只要描述符不是完全一致的两个方法也可以共存.也就是说,如果两个方法有相同的名称和特征签名,但是返回值不同,那么也是可以合法共存与同一个class文件中的

1.1字段字节码分析

javap分析常亮池得出:

文件分析:

分析:

 

       直接看方法表部分,首先是右下角的methods_count:0x00 02表示方法集中有两个方法.access_flags:0x00 01表示访问标志值为1,对应上面的方法访问标志表的public,在看源文件的方法确实是public.name_index:0x00 07表示方法的名称索引为7,对应上面的常量池7,为"<init>".decriptor_index:0x00 08代表描述符索引值为8,对应上面常量池的"()v".attributes_count:0x00 01代表此方法的属性表集合有一项属性,属性的名称索引为0x00 09,对应上面常量池9为"code ",说明此属性是方法的字节码描述.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值