最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码。

为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构。

于是,我就认真看了下OpenJDK中Java字节码文件的相关源码,结合大学期间对JVM的研究,参考JVM规范第2版(英文原版),特意整理下。

JVM规范中定义的类文件的结构

注:使用是类似于C语言的表示方法

u1: unsigned one-byte  无符号一个字节

u2: unsigned two-byte  无符号两个字节

u4: unsigned four-byte 无符号四个字节

ClassFiel{

//魔法数字

u4 magic;

//次版本号

u2 minor_version;

//主版本号

u2 major_version;

//常量池中常量的个数

u2 constant_pool_count;

//常量池数组

cp_info_constant_pool[constant_pool_count-1];

//类或接口的访问标识符

u2 access_flag;

//这个类在常量池中的下标

u2 this_class;

//这个类的父类在常量池中的下标

u2 super_class;

//父接口的数量

u2 interfaces_count;

//父接口的数组

u2 interfaces[interfaces_count];

//字段的个数

u2 fields_count;

//字段的信息

field_info fields[fields_count];

//方法的个数

u2 methods_count;

//方法的信息

method_info methods[methods_count];

//属性的个数(不是字段)

u2 attributes_count;

//属性的信息,attribute_info是一种用来表示信息的结构

attribute_info attributes[attributes_count];

}

OpenJDK中定义的类文件的结构

public class ClassFile {

public final int magic;
    public final int minor_version;
    public final int major_version;
    public final ConstantPool constant_pool;
    public final AccessFlags access_flags;
    public final int this_class;
    public final int super_class;
    public final int[] interfaces;
    public final Field[] fields;
    public final Method[] methods;
    public final Attributes attributes;

}

定义异同点

OpenJDK中的定义和JVM规范中的定义,是等同的。

区别就是表示方法不一样,前者是Java语言表示方式,后者是类似于C语言的表示方式。

不足之处

详细描述,每一个数据结构,估计需要花费太多的篇幅。

本文浅尝辄止,大家对Java字节码文件的结构有个大概的了解就好。

下一篇,我们将介绍如何读取.class文件。

未来计划

JDK,JVM,Javac,字节码等内容实在是太多了,好多我也还在研究之中。

最近,写作任务很艰巨,只能一篇篇的写。

还望大家理解。

互动交流

OpenJDK源码研究笔记系列文章,都是我的原创。

有啥不懂的问题,可以留言。

有啥觉得不对的地方,欢迎指正。

参考资料:OpenJDK源码,JVM规范第2版(英文原版)

相关阅读http://blog.csdn.net/fansunion/article/category/1686259

原文参见http://FansUnion.cn/articles/2967

最新文章

  1. python 3 学习笔记(一)
  2. JS添加MD5,JS提示框
  3. SQL Server 查看存储过程执行次数的方法
  4. ios openURL的使用(调用系统电话、浏览器、地图、邮件等)
  5. NOT EXISTS优化
  6. Java如何从HttpServletRequest中读取HTTP请求的body
  7. 获取TBitMap图像缓冲区,提高图像处理速度
  8. [转载]ACM搜索算法总结(总结)
  9. ACM 今年暑假不AC
  10. CoordinatorLayout 自定义Behavior并不难,由简到难手把手带你撸三款!
  11. 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析
  12. python中线程和进程(一)
  13. NEST - 返回部分文档
  14. gdb 常用调试命令
  15. Django 访问admin提示ViewDoesNotExist at /admin/
  16. 五分钟读懂UML类图(转)
  17. Oracle —— 如何执行SQL文件
  18. [BZOJ3772]精神污染 主席树上树+欧拉序
  19. 一个牛人给Java初学者的建议
  20. kali linux 2018.2 mysql密码修改后无效,外部无法连接问题。

热门文章

  1. matlab张量工具初步
  2. POJ 2431 Expedition (priority_queue或者multiset可解)
  3. 3ds Max脚本的使用实例教程
  4. CF666E Forensic Examination(后缀自动机+线段树合并)
  5. CF1000G Two-Paths (树形DP)
  6. php7 memcache和memcached.so扩展
  7. tree编译
  8. 紫书 例题 10-1 UVa 11582 (unsigned long long+模)
  9. debug和release的区别
  10. 【BZOJ 1059】[ZJOI2007]矩阵游戏