java class文件结构

原创 2017年08月13日 00:49:11

class文件格式:

image.png

测试文件:

package org.fenixsoft.clazz;

public class TestClass {

      private int m;

      public int inc() {

            return m + 1;

      }

}

(一)魔法数0XCAFEBABE:

image.png

(二)次 版本号0X00:

image.png

(三)主版本号0X33(十进制为49,对应java6):

image.png

(四)常量池0X16,表示后续有21个常量:

image.png

常量池项目类型表:

image.png

(4.1)常量池中第一个常量表:

image.png

CONSTANT_class_info型常量结构表:

image.png

name_index是一个索引值,它指向常量池中一个CONSTANT_utf8_info类型的常量,此常量代表这个类(或者接口)的全限定名。

测试用class_info标志位:

image.png

测试用class_info索引值,0X02指向常量池中第二个常量:

image.png

常量池中11种数据类型结构总表:

image.png

(4.2)第二项常量的标志位,0X01表示该常量类型为utf8_info类型,此处为常量池中第二个常量表:

image.png

utf8_info表的标志位:

image.png

第二项常量utf8_info表的长度0X1D(29)

image.png

class包名org.fenixsoft.clazz/Testclass;

image.png

继续往下分析。。。

(4.3)常量池中第三个常量表(class_info表):

image.png

标志位:

image.png

0X04表示指向常量池中第四个常量

image.png

(4.4)指向CONSTANT_utf8_info常量表,此为常量池中第四个常量表:

image.png

image.png

image.png

长度为16的java/lang/object

image.png

(4.5)常量池中第五个常量表(utf8_info表),值为m:

image.png

(4.6)常量池中第六个常量表(utf8_info表),值为I:

image.png

(4.7)常量池中第七个常量表(utf8_info表),值为<init>:

image.png

(4.8) 常量池中第八个常量表(utf8_info表),值为()V:

image.png

(4.9) 常量池中第九个常量表(utf8_info表),值为Code:

image.png

(4.10) 常量池中第十个常量表(Method_info表):

image.png

(4.11) 常量池中第十一个常量表(NameAndType_info表):

image.png

(4.12) 常量池中第十二个常量表(utf8_info表),值为LineNumberTable:

image.png

(4.13) 常量池中第十三个常量表(utf8_info表),值为LocalVariableTable:

image.png

(4.14) 常量池中第十四个常量表(utf8_info表),值为this:

image.png

(4.15) 常量池中第十五个常量表(utf8_info表),值为Lorg/fenixsoft/clazz/TestClass; :

image.png

(4.16) 常量池中第十六个常量表(utf8_info表),值为inc:

image.png

(4.17) 常量池中第十七个常量表(utf8_info表),值为()I:

image.png

(4.18) 常量池中第十八个常量表(CONSTANT_field_info表):

image.png

(4.19) 常量池中第十九个常量表(CONSTANT_NameAndType_info表):

image.png

(4.20) 常量池中第二十个常量表(utf8_info表),值为SourceFile:

image.png

(4.21) 常量池中第二十一个常量表:

image.png

至此,常量池的表结束。

(五)访问标志位表:

用于确定class是类还是接口,是否定义为public,是否定义为abstract,如果是类的话,是否被声明为final,等

image.png

image.png

0X21=ACC_PUBLIC | ACC_SUPER(0X0001 | 0X0020=0X0021)

(六)类索引,父类索引,接口索引集合:

类索引查找全限定名的过程:

image.png

类索引:

image.png

父类索引:

image.png

接口索引,本例中,没有接口,所以索引号为0:

image.png

(七)字段表结构:

image.png

字段表,批注1处,0X01表示该类只有一个字段,即计数器为1,批注2处0X02表示访问标识为ACC_PRIVATE,

批注3处0X05标识name_index指向常量池的第五个常量,即上面所列的CONSTANT_utf8_info字符串m,

批注4处0X06表示descriptor_index的值为0X06,指向常量池的第六个常量,即I,根据这些信息,我们可以推断,

源代码定义的是private int m,批注5处,0X00表示字段m的属性计数器为0,索引额外的信息描述为0X00:

image.png

(八)方法表:

方法表结构:

image.png

批注1处0X02表示方法表计数器容量为2,代表集合中有两个方法,标注2处0X01访问标志表示ACC_PUBLIC,

标注3处0X07表示名称索引值为7,对应<init>方法,标注4处0X08表示描述符索引为8,对应常量为()V,标注5处

0X01表示属性表计数器为1,表示此方法属性表集合有一项属性,属性名称索引为0X09,对应常量为Code,说明此属性是

方法的字节码

image.png

(九)属性表结构:

image.png

虚拟机规范的预定义属性

image.png

Code属性表结构:

image.png

java程序体的代码经过javac编译后,最终变为字节码存储在Code属性内(接口和抽象类没有Code属性),

attribute_name_index是一项指向CONSTANT_utf8_info型常量的索引,常量值固定为Code,attribute_length指示了属性值得长度,属性名称索引

和属性长度一共是6个字节,所以属性值得长度固定为整个属性表的长度减去6个字节。max_stack代表了操作数栈的最大深度,max_locals代表局部变量所需的存储空间,

code用来存储java源程序编译后生成的字节码指令,code_length代表字节码长度(虚拟机规范中规定一个方法不允许超过65535条字节码指令),

属性表集合(属性表总长度为0X2F):

image.png

标注1处max_stack代表了操作数栈最大深度值为1,标注2处max_locals本地变量表容量为1,

image.png

字节码长度为5

image.png

按照顺序,依次读入紧随的5个字节,字节码指令为0X2A,0XB7,0X00,0X0A,0XB1

image.png

翻译过程

读入2A,对应指令为aload_0

读入B7,对应指令为invokespecial

读入0X000A,这是invokespecial的参数

读入B1,对应的指令为return

字节码之后是异常表,异常表对于Code属性不不一定是存在的。异常表如图:

image.png

意义为如果字节码从start_pc到end_pc间出现了异常类型为catch_type或其子类异常,则转到handler_pc处理。

以下省略Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性,ConstantValue属性,

InnerClass属性,Deprecated和Synthetic属性。


JVM笔记5:Class文件结构

Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Cla...
  • a19881029
  • a19881029
  • 2013年12月01日 16:51
  • 8483

【深入Java虚拟机】之二:Class类文件结构

Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使...
  • mmc_maodun
  • mmc_maodun
  • 2014年01月02日 23:55
  • 15974

Java Class文件结构解析 及 实例分析验证

Class文件是JVM执行引擎的数据入口,也是Java技术体系的基础构成之一;下面我们详细了解Class文件:先对Class文件结构有个大体了解,并了解Class文件结构里的一些名称定义;而后再详细说...
  • tjiyu
  • tjiyu
  • 2016年12月25日 18:57
  • 3842

《深入理解java虚拟机》笔记——简析java类文件结构

一直不太搞得明白jvm到底是如何进行类加载的,在看资料的过程中迷迷糊糊,在理解类加载之前,首先看看java的类文件结构到底是怎样的,都包含了哪些内容。  最直接的参考当然是官方文档:The Java®...
  • zhoufenqin
  • zhoufenqin
  • 2016年04月03日 15:31
  • 2038

java 的*.class文件结构

java class文件结构   从上图中可以看到,一个 Java 类文件大致可以归为 10 个项: Magic:该 项存放了一个 Java 类文件的魔数(magic number)和版本信...
  • u012572439
  • u012572439
  • 2013年11月12日 20:01
  • 671

java class文件结构(二)

Java类文件是Java程序的二进制表示形式。每一个类文件代表一个类或者接口。不可能在一个类文件中放入多个类或者接口。这样就使得无论类文件是在哪一种平台上生成,都可以在任何主机上执行。 一、什么...
  • zhang434
  • zhang434
  • 2013年12月31日 21:44
  • 496

Java的字节码class文件结构

学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一 个无关 性那就是语言无关性,要实现语言无关性,那么Java体...
  • Hello__Zero
  • Hello__Zero
  • 2014年02月10日 10:07
  • 997

Java的class文件结构

http://blog.itpub.net/post/5087/24444/ http://blog.csdn.net/nanjingjiangbiao/article/details/751554...
  • mylitboy
  • mylitboy
  • 2012年05月21日 21:20
  • 2041

java class文件结构(一)

java class文件结构 从上图中可以看到,一个 Java 类文件大致可以归为 10 个项: Magic:该 项存放了一个 Java 类文件的魔数(magic number)和...
  • zhang434
  • zhang434
  • 2013年12月31日 21:42
  • 448

Java Class文件结构

一、平台无关性的基石
  • supportUAT
  • supportUAT
  • 2014年05月27日 23:12
  • 310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java class文件结构
举报原因:
原因补充:

(最多只允许输入30个字)