最近在看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

OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构的更多相关文章

  1. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

  2. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  3. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  4. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  5. OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法

    本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法.  这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...

  6. OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常

    OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...

  7. OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  8. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  9. OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计

    前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...

随机推荐

  1. NPInter数据集的奇葩标号的出坑秘籍

    这篇恐怕是有始以来命名最无奈标题了.需要写一下攻略. 业内人士都熟知NPInter,但是该数据库一直以来访问受限.不过终于能访问得到数据集. 但是蛋疼的是2.0的数据库id的命名方法实在奇葩,想了很多 ...

  2. 让placeholder中的默认文字居中,或者缩进多少像素

    直接给input或者textarea的样式加texta-align:center; <input type="" name="" id="&qu ...

  3. 3ds Max绘制青花瓷茶壶

    1.在桌面找到3DMAX软件,左键双击,启动程序: 2.在命令案板中,找到几何体,茶壶,在顶视图绘制一个茶壶: 3.在百度图片中搜索,查找“青花瓷”,找到一个自己喜欢的精美图案,截图保存备用: 4.在 ...

  4. appium ios端自动化测试配置

    一.安装环境介绍macOS 10.12.4 Xcode 8.3.2 适用机型:iOS9 及以上机型 二.Appium源码安装Xcode升级8.2之后不再支持UIAutomation,转而使用XCUIT ...

  5. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  6. C#打开或者创建一个文件,然后向其末尾写入数据的方法

    原文:C#打开或者创建一个文件,然后向其末尾写入数据的方法             FileStream fs = new FileStream(@"d:\timetick.txt" ...

  7. HNU 13101 The Triangle Division of the Convex Polygon 组合数的因式分解求法

    题意: 求第n-2个Catalan数 模上 m. 思路: Catalan数公式: Catalan[n] = C(n, 2n)/(n+1) = (2n)!/[(n+1)!n!] 因为m是在输入中给的,所 ...

  8. 【codeforces 589G】Hiring

    [题目链接]:http://codeforces.com/problemset/problem/589/G [题意] 有n个人; 每个人每天在开始工作之前,都需要di单位的准备时间,然后才能开始工作; ...

  9. c++ string类的完整实现!!!

    本文实现了c++ STL中的basic_string模板类,当然.通过typedef也就实现了string类和wstring类.限于篇幅,实现代码中用到了标准库的char_traits模板类,本人自己 ...

  10. 2015年开源项目荣登GitHub十强榜单

    翻译出自:51CTO.com 开源是一个好东西,2015最振奋人心的就是swift开源. <软件开发时代>杂志(SD Times)回想了GitHub上的一些流行项目,这些项目已给开放和自由 ...