Java字节码结构剖析一:常量池

电玩女神 2022-04-15 02:28 312阅读 0赞

这篇博客开始,我打算带大家去解读一下JVM平台下的字节码文件(熟悉而又陌生的感觉)。众所周知,Class文件包含了我们定义的类或接口的信息。然后字节码又会被JVM加载到内存中,供JVM使用。那么,类信息到了字节码文件里,它们如何表示的,以及在字节码里是怎么分布的呢?带着这些问题,让我们去深入了解字节码文件吧。
Class文件的结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间地数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
每一个 Class 文件对应于一个如下所示的 ClassFile 结构体。

  1. ClassFile {
  2. u4 magic;
  3. u2 minor_version;
  4. u2 major_version;
  5. u2 constant_pool_count;
  6. cp_info constant_pool[constant_pool_count-1];
  7. u2 access_flags;
  8. u2 this_class;
  9. u2 super_class;
  10. u2 interfaces_count;
  11. u2 interfaces[interfaces_count];
  12. u2 fields_count;
  13. field_info fields[fields_count];
  14. u2 methods_count;
  15. method_info methods[methods_count];
  16. u2 attributes_count;
  17. attribute_info attributes[attributes_count];
  18. }

这种数据结构,类似C语言结构体。这个结构体中只有两种数据类型:无符号数和表,后面的解析都要以这两种数据类型为基础,所以这里要先介绍这两个概念。

原文链接

发表评论

表情:
评论列表 (有 0 条评论,312人围观)

还没有评论,来说两句吧...

相关阅读