Class文件结构神秘的微笑(二)
揭开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文件结构神秘的微笑(二)相关推荐
- [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(二)
[ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(一) [ 网络协议篇 ] 一篇文章让你掌握神秘的 DHCP(二) 上篇回顾: 详细介绍了DHCP的基本概念,作用,报文类型,报文格式,端口,角色等 ...
- PE文件结构详解(二)可执行文件头
by evil.eagle 转载请注明出处. http://blog.csdn.net/evileagle/article/details/11903197 在PE文件结构详解(一)基本概念里,解释了 ...
- 解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全
文章目录 一.前言 二.Kafka消息队列 2.1 生产者生产kafka中的消息数据 2.1.1 生产者生产kafka中的消息数据 2.1.2 kafka生产者高效写盘 2.2 消费者消费kafka中 ...
- 神秘贼掉包二维码,支付宝赔偿200多,烧烤小哥为何还骂支付宝没良心?
白天气温超过了40度,烧烤小哥站在400度的烧烤炉旁.客人们吹着空调扇着风扇大声聊天.烧烤小哥用扇子扇着炭火,眼睛偷偷瞄着马路上有没有城管的车过来.心里想,已经凌晨12点了,城管应该都已经睡了. &q ...
- 揭开二维码背后的神秘面纱用二维码识别 API 就够了
写在前面 二维码(QR code)已经成为现代生活中不可或缺的一部分.二维码具有可靠性.快速识别.易于存储等优点,因此在广泛应用于支付.门票.社交网络.广告等方面.但是,对于大多数人来说,二维码背后的 ...
- 有点做作--撩开“中国雅皮士”的神秘面纱(二)
野外生存:矫情的"幸福过剩症" 在写字楼呆久了,据说会得一种白领职业病"亚健康",比如"空调综合症"."电子辐射症".& ...
- PE文件结构详解(四)PE导入表
PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...
- PE文件结构详解(三)PE导出表
上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...
- 【转】PE文件结构详解--(完整版)
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 ...
最新文章
- uiswitchbutton 点击不改变状态_Redux 包教包会(一):解救 React 状态危机
- AD7606数据采集板使用ASCII码传递BINARY数据
- Selenium3自动化测试——5. 鼠标悬停操作
- vue中v-model原理
- Notepad++远程连接Linux系统
- iOS开发网络资源整理-持续更新
- Android之React native的介绍和入门指南
- javap的用途不断发展:您的Java类文件中隐藏了什么?
- 重装系统计算机名称回对ug,电脑重装系统后UG软件没有卸载的情况下重新启动UG软件的方法...
- matlab五角星的二维作图,MATLAB二维画图综合实例
- 蓬荜生辉的意思是什么?蓬荜生辉用在什么场合?
- python xml转字典_python xml转成dict
- Python网页简单小爬虫
- 纯虚函数的一些问题和注意事项
- 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类
- 计算机联锁静态数据表,计算机联锁功能.doc
- 本地化、国际化、全球化是指什么?
- SAP ABAP内表OCCURS,WORK AREA等 语法对比!
- ch341a i2c 安卓_CH341-I2C-labview-all-vision CH341A的I2C接口Labview all vision - 下载 - 搜珍网...
- 关于iPad作为Win10系统拓展屏的心得
热门文章
- 如何给PDF文件进行加密?
- CSV文件打开乱码解决方法
- 【k8s系列001】K8s集群部署H2O
- 年底裁员潮,这个冬天你怎样度过?
- 【ceph】集群搭建(centos7-1908)
- realme有升级到android10的,RealmeX/Q将升级安卓10底层刷机包
- 指纹测试天赋测试软件,指纹也能测天赋 10分钟出结果(图)
- 杭州电子科技大学计算机考研复试分数线,2021年杭州电子科技大学考研分数线及复试名单公布...
- 三星Galaxy S20:将侧面按钮更改为电源按钮
- 渠道、数据、技术,谁才是网络信贷市场的决胜因素?