揭开Class文件结构神秘的微笑(二)

  • 继续分析Class文件
    • 访问标志:
    • 本类的引用:
    • 父类索引:
    • 继承的接口个数:
    • 类中字段个数:
    • 字段表:
      • ①访问标志:
      • ②方法名称索引:
      • ③字段描述符索引:
    • 属性个数:
    • 类方法个数:
    • 方法表:
      • ①方法属性个数:
      • ②方法属性表:

“利用碎片化的时间,为你精讲局部知识。”

建议看完上一篇再来看这一篇

先把Class文件的表结构跑出来,回忆一下:

继续分析Class文件

访问标志:


访问标志并非简单的一个值,而是采用分位组合的值,我们根据下面这个表来判断包含了哪些值;

16进制的0021转化为二进制为0000 0000 0010 0001,可以很方便的看出由ACC_PUBLIC和ACC_SUPER组成。0020|0001=0021 通过高低位间隔设计,从而使两个字节容纳下了更多的种类,构思精巧。

本类的引用:


03指向了常量池的索引3,也就是下图中的 com/test/TestClass

父类索引:


04指向了常量池中的4索引,也就是:java/lang/Object

继承的接口个数:


00代表0个接口。所以接在本字段后面的接口表也就省略了。

类中字段个数:


00 01代表类中字段的个数是1个。那么揪下来接在这个字段之后的字段信息表就只有1个。

字段表:

下面看下字段表含有什么:

①访问标志:

和之前的类访问标志的值设定是一个道理;


0002对应的就是ACC_PRIVATE,代表这个字段是私有的。

②方法名称索引:



0005指向常量池索引5,也就是字面量:m

③字段描述符索引:


0006代表指向常量池索引6,也就是:I ,这个I代表这个字段的类型是整形int

属性个数:

0000代表0个,有可能字段会有初值之类的附加信息,会存在属性表里里面。这里属性表没有携带。

类方法个数:

0002代表该类存在2个类方法,其中有一个是编译器自动添加的方法,暂时可以不用去管。

方法表:

由于前面说明会有2个方法,故存在两个方法表;
我贴一下方法表的结构:

由于标识符、方法名称索引、方法描述索引都与字段表别无差异,所以这里不再重复了。跳过6个字节,我们看一下方法的属性表。

①方法属性个数:

0001代表含有1个属性表(备注:方法一般会把方法中的代码翻译成JVM执行的字节码,然后放置在这个属性表之中)

②方法属性表:

其实属性表的种类高达29种,由于篇幅原因,这里不再摆出来。方法属性表的名称是Code。我们来看下JVM是怎么判断的把。

接下来2个字节是:0009,指向常量池索引9,也就是Code字面量值,代表后面跟着的是Code属性表(方法属性表)

我们可以参照Code表结构进行解析了:


属性表长度:1D代表有29个字节长度。

操作数栈深度:0001,深度是1
局部变量表长度:0001,最大长度是1,也就是只含有一个局部变量。读者观察方法会发现没有局部变量,其实编译器会为我们传入this关键字对象作为本类的索引,所以会有一个默认的局部参数this。

Code字节码长度:00 00 00 05,代表有5个字符长度。

Code字节码:2A B7 00 01 B1,这些是JVM基于操作数栈的指令,这里不再细讲。

异常表数量:00 00

后面的不再细讲赘述,读者可以自己尝试一下。

尾巴:以上知识点融入了自己的理解,如果有疑问或不足,欢迎评论区或私信讨论。
参考文献:
《深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)》
作者:周志明
ISBN:9787111641247

Class文件结构神秘的微笑(二)相关推荐

  1. [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(二)

    [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(一) [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(二) 上篇回顾: 详细介绍了DHCP的基本概念,作用,报文类型,报文格式,端口,角色等 ...

  2. PE文件结构详解(二)可执行文件头

    by evil.eagle 转载请注明出处. http://blog.csdn.net/evileagle/article/details/11903197 在PE文件结构详解(一)基本概念里,解释了 ...

  3. 解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全

    文章目录 一.前言 二.Kafka消息队列 2.1 生产者生产kafka中的消息数据 2.1.1 生产者生产kafka中的消息数据 2.1.2 kafka生产者高效写盘 2.2 消费者消费kafka中 ...

  4. 神秘贼掉包二维码,支付宝赔偿200多,烧烤小哥为何还骂支付宝没良心?

    白天气温超过了40度,烧烤小哥站在400度的烧烤炉旁.客人们吹着空调扇着风扇大声聊天.烧烤小哥用扇子扇着炭火,眼睛偷偷瞄着马路上有没有城管的车过来.心里想,已经凌晨12点了,城管应该都已经睡了. &q ...

  5. 揭开二维码背后的神秘面纱用二维码识别 API 就够了

    写在前面 二维码(QR code)已经成为现代生活中不可或缺的一部分.二维码具有可靠性.快速识别.易于存储等优点,因此在广泛应用于支付.门票.社交网络.广告等方面.但是,对于大多数人来说,二维码背后的 ...

  6. 有点做作--撩开“中国雅皮士”的神秘面纱(二)

    野外生存:矫情的"幸福过剩症" 在写字楼呆久了,据说会得一种白领职业病"亚健康",比如"空调综合症"."电子辐射症".& ...

  7. PE文件结构详解(四)PE导入表

    PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...

  8. PE文件结构详解(三)PE导出表

    上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...

  9. 【转】PE文件结构详解--(完整版)

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 ...

最新文章

  1. uiswitchbutton 点击不改变状态_Redux 包教包会(一):解救 React 状态危机
  2. AD7606数据采集板使用ASCII码传递BINARY数据
  3. Selenium3自动化测试——5. 鼠标悬停操作
  4. vue中v-model原理
  5. Notepad++远程连接Linux系统
  6. iOS开发网络资源整理-持续更新
  7. Android之React native的介绍和入门指南
  8. javap的用途不断发展:您的Java类文件中隐藏了什么?
  9. 重装系统计算机名称回对ug,电脑重装系统后UG软件没有卸载的情况下重新启动UG软件的方法...
  10. matlab五角星的二维作图,MATLAB二维画图综合实例
  11. 蓬荜生辉的意思是什么?蓬荜生辉用在什么场合?
  12. python xml转字典_python xml转成dict
  13. Python网页简单小爬虫
  14. 纯虚函数的一些问题和注意事项
  15. 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类
  16. 计算机联锁静态数据表,计算机联锁功能.doc
  17. 本地化、国际化、全球化是指什么?
  18. SAP ABAP内表OCCURS,WORK AREA等 语法对比!
  19. ch341a i2c 安卓_CH341-I2C-labview-all-vision CH341A的I2C接口Labview all vision - 下载 - 搜珍网...
  20. 关于iPad作为Win10系统拓展屏的心得

热门文章

  1. 如何给PDF文件进行加密?
  2. CSV文件打开乱码解决方法
  3. 【k8s系列001】K8s集群部署H2O
  4. 年底裁员潮,这个冬天你怎样度过?
  5. 【ceph】集群搭建(centos7-1908)
  6. realme有升级到android10的,RealmeX/Q将升级安卓10底层刷机包
  7. 指纹测试天赋测试软件,指纹也能测天赋 10分钟出结果(图)
  8. 杭州电子科技大学计算机考研复试分数线,2021年杭州电子科技大学考研分数线及复试名单公布...
  9. 三星Galaxy S20:将侧面按钮更改为电源按钮
  10. 渠道、数据、技术,谁才是网络信贷市场的决胜因素?