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版)这里就不细讲
其中常量池的里面的信息最为复杂,java虚拟机运行时刻的所有信息都是从常量池来获取的,常量池定义了一下几种结构
java语言是跨平台的,所谓一次编写,到处运行。之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用javaclass文件来表示的,javaclass文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在windows系统上都是一致的。这个就好比html文件,我们定义好规范,这个系统只要去按照规范显示出来里面的内容就好了。好比html就是class文件,浏览器就是虚拟机一样,通过浏览器去执行html的渲染过程,我们无论是用手机,Windows系统,苹果系统上网,显示出来的内容都是一样。java虚拟机可以从class文件中加载预定义的字节码,也可以从网络,数据库,消息文件中加载字节码。
下面来说说javaclass的文件结构,javaclass文件结构是基于字节流的,用unicode进行编码。其实想想也可以完全用xml文件表示,只不过用xml表示的字节码文本体积可能会很大,占用空间,同时解析起来比较耗时,而且很容易被人为修改,导致未知错误。下面是class文件的内部结构
简要解释一下:
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虚拟机运行时刻的所有信息都是从常量池来获取的,常量池定义了一下几种结构
相关文章推荐
- java Class文件内部结构解析过程详解
- java Class文件内部结构解析
- java Class文件内部结构解析
- java Class文件内部结构解析
- java Class文件内部结构解析
- Java class 文件结构及解析
- Java Class文件结构解析 及 实例分析验证
- 二进制 java Class文件解析实例
- Java class 文件的结构
- 实例分析Java Class的文件结构
- class文件内部结构
- Java的字节码class文件结构
- JVM探索之路之Class文件结构解析(二):常量池
- 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- 解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
- 实例分析Java Class的文件结构
- java的class文件解析(右键查看图片即可)
- 按sun标准解析的java class文件
- Java Class文件深度格式解析
- 实例分析Java Class的文件结构