Class 文件

总体结构


java 虚拟机规范的定义

u1 u2 u4 u8 分别表示 无符号单字节 2字节 4字节 8字节的整数

魔数(magic number)

一个4字节无符号整数 固定为 0xCAFEBABE

当虚拟机加载类的时候会首先读取并校验魔数,如果不为 0xCAFEBABE则会抛出 异常 ClassFormatError


<<自己动手写 java 虚拟机>> 的代码

版本号

紧跟在魔术后面就是 Class的小版本和大版本号

表示当前 Class 文件是由那个版本的编译器编译产生的 分别2字节标识

Class 文件版本号和平台的对应

java 虚拟机向下兼容 高版本的虚拟机可以执行由低版本编译器生成的 class 文件

除了1.1版本的虚拟机 对应的小版本号不为0 其他编译器版本的小版本号都为0

在读取并校验魔数通过之后会读取版本号并进行校验


<<自己动手写 java 虚拟机>> 的代码


常量池

跟在版本号后面的是 Class 文件的常量池信息

constant_pool_count

常量池的大小 标识该 Class 文件有多少个常量池表项 常量池0为空缺项 不存放实际内容

constant_pool

常量池表项信息 每个表项由 tag 值标识

常量池表项对应的 tag 值


格式定义


格式定义


格式定义


格式定义


格式定义


格式定义


格式定义


decriptor_index中类型的字符串标识






Class访问标识

常量池后面是访问标记 该标记使用两个字节标识,用于表明类的访问信息



class 为类可用的访问标记

当前类,父类和接口

类访问标记后面是 该类类别,父类类别以及实现的接口的数量和实现的接口的类名this_class,super_class 都是2字节的无符号整数,指向常量池中的 CONSTANT_Class

Class文件的字段

在之后是类的字段信息 首先指明字段的个数

字段的访问标记

name_index和 descriptor_index 指向常量池中 CONSTANT_Utf8 用户描述字段名及字段的类型

attributes_count 和 attributes 用于存储字段的一些属性,如初始值,注释信息等


常量属性结构

Class文件的方法基本结构



方法的执行主体 --Code 属性

记录行号和局部变量表


抛出异常 Exceptions属性

SourceFile 属性

描述当前 Class文件由哪个源文件编译得到


BootstrapMethods 属性

1.7中增加了这个属性 用于支持 invokeDynamic 指令 ,这个属性描述和保存引导方法

InnerClasses属性

描述外部类与内部类之间的关系

Deprecated 属性

表示 类方法或字段在未来版本中将被废弃

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 字节码查看工具:WinHex 前言 Java虚拟机实现语言无关性的基石就是Class文件Java虚拟机提供的语言无...
    zlcook阅读 7,169评论 4 18
  • Class文件是Java程序跨平台的保证,正是由于有了Class文件架起源码和机器码之间的中间桥梁,JVM虚拟机才...
    李牙刷儿阅读 281评论 0 2
  • Java的跨平台特性建立在Java虚拟机之上。 Java虚拟机在不同平台上有不同的版本,但是他们都能执行同一cla...
    趁现在赶快回家阅读 533评论 0 0
  • Java代码必须要被编译成class文件后,虚拟机才能够加载运行,要搞清楚Java的类加载机制,首先必须要理解Cl...
    云飞扬1阅读 10,134评论 2 61
  • 我相信每个人心中都有自己的判断,有自己的原则,有自己的底线,更重要的是我们都有自己的良知。 又是...
    倚梦芊瑶阅读 470评论 0 4