您的位置:首页 > 编程语言 > Java开发

java Class文件内部结构解析

2012-04-15 14:42 447 查看
大学的时候,就看过java虚拟机规范第二版,最近把最新的Java虚拟机规范第三版(javase1.7版本)温习了一遍,发现java虚拟机规范中javaclass的文件结构部分并没有太大的变化,顺便也整理了一下。

java语言是跨平台的,所谓一次编写,到处运行。之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用javaclass文件来表示的,javaclass文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在windows系统上都是一致的。这个就好比html文件,我们定义好规范,这个系统只要去按照规范显示出来里面的内容就好了。好比html就是class文件,浏览器就是虚拟机一样,通过浏览器去执行html的渲染过程,我们无论是用手机,Windows系统,苹果系统上网,显示出来的内容都是一样。java虚拟机可以从class文件中加载预定义的字节码,也可以从网络,数据库,消息文件中加载字节码。

下面来说说javaclass的文件结构,javaclass文件结构是基于字节流的,用unicode进行编码。其实想想也可以完全用xml文件表示,只不过用xml表示的字节码文本体积可能会很大,占用空间,同时解析起来比较耗时,而且很容易被人为修改,导致未知错误。下面是class文件的内部结构

ClassFile{ u4magic; u2minor_version; u2major_version; u2constant_pool_count; cp_infoconstant_pool[constant_pool_count-1]; u2access_flags; u2this_class; u2super_class; u2interfaces_count; u2interfaces[interfaces_count]; u2fields_count; field_infofields[fields_count]; u2methods_count; method_infomethods[methods_count]; u2attributes_count; attribute_infoattributes[attributes_count]; }


简要解释一下:

U4代表由无符号四个字节组成

u4magic:是一个固定的数值,java虚拟机里面称为魔数,主要是用来标识是否为java虚拟机所支持的文件结构,目前是0xCAFEBABE

u2minor_version;u2major_version;代表次版本号和主版本号

u2constant_pool_count;cp_infoconstant_pool[constant_pool_count-1];这里面代表常量池个数以及常量池信息

u2access_flags:代表class访问标记,例如:publicprotected

u2this_class:代表这个类的名称例如java.lang.Object

u2super_class:代表父类名称

u2interfaces_count;u2interfaces[interfaces_count];实现的接口格式以及接口类名

u2fields_count;field_infofields[fields_count];字段个数以及字段信息

u2methods_count;method_infomethods[methods_count];方法个数以及方法信息

u2attributes_count;attribute_infoattributes[attributes_count];javaclass文件内部属性信息,和java语言定义的属性没有关系,纯粹就是给java虚拟机用的





以上都是java虚拟机规范中定义的class文件内部结构信息,可以参考Java虚拟机规范(JavaSE7版)这里就不细讲

每种结构又都定义了自己的结构信息,例如:常量池结构,字段信息,方法信息,类信息,这几种结构之间又都互相引用,下面这幅图简要介绍了javaclass文件的内部结构信息

其中常量池的里面的信息最为复杂,java虚拟机运行时刻的所有信息都是从常量池来获取的,常量池定义了一下几种结构



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: