带你阅读class文件,了解访问标志,类索引、父类索引与接口索引集合,字段表、方法表、属性表

5 篇文章 0 订阅

读class文件是个漫长的过程,但阅读并不需要你手写二进制代码那么恐怖,只是重在理解,能够更好的理解虚拟机执行引擎,也很好的提升java基础。

阅读class文件分为两篇,下面是另一篇的链接。
带你阅读class文件,认识class文件中的常量池

访问标志

class文件常量池之后,继而是访问标志,即这个类的public、final、interface、abstract等访问信息。(下表不全)
在这里插入图片描述
例如下图中,橙色两个字节就是访问标志,代表0x0021,表示ACC_PUBLIC,ACC_SUPER
在这里插入图片描述

类索引与父类索引

访问标志结束以后,类索引和父类索引分别有两个字节,一个指向当前类名,一个指向父类。
绿色代表类索引,褐色代表父类索引。(示意图与jclasslib打开的不是一个文件)索引会先找到常量池中的CONSTANT_Class_info然后再找到CONSTANT_Utf8_info,类名信息就存放在CONSTANT_Utf8_info中。

在这里插入图片描述在这里插入图片描述
举例
我们从7的CONSTANT_Class_info找到了33的CONSTANT_Utf8_info,里面存放着类名信息。
在这里插入图片描述
父类索引同理,该类的父类是Object,也就是没有其他类。
在这里插入图片描述
以上这些信息都可以用jclasslib查看
在这里插入图片描述

接口索引

在java语言中,接口是可以多实现的,所以这里需要引入计数器(计数器我们会经常用到)来统计接口索引的数量,计数器含有两个字节,下图中黄色代表实现了0个接口。那么也就没有接口索引。如果有的话寻找方式与上一小节中相同。
在这里插入图片描述

字段表

字段表描述接口或类中的变量,但不包括方法中的局部变量。java中,字段可以有多个,那么我们又需要引入什么? 字段计数器,这里我们就不用这么详细了吧,直接开始读class文件。
首先字段表结构如下:在这里插入图片描述
下图中不同颜色的含义已经注明了。
在这里插入图片描述
这里我们有一个字段,如果有多个那么就会有多个字段表。

方法表

在方法表之前首先也是计数器,然后方法表结构如下
在这里插入图片描述
开始阅读:
在这里插入图片描述

属性表

class文件、字段表、方法表都可以携带属性表。属性名称有很多,不同的属性也有不同的结构,下面是属性的通用结构。
在这里插入图片描述
属性类型举例:

code方法表
ConstantValue字段表
Exceptions方法表
InnerClasses类文件

等等,还有很多,都有各自的结构。

阅读class文件:
在这里插入图片描述

总结

当然,以上是最原始的办法,但也是帮助我们认知的一个途径,在今后使用jclasslib即可,经过学习我们也更能深入理解该工具的各个项的含义。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值