第五章:字节码文件

一、魔数、版本号、常量池。

1、使用javap -verbose 命令分析一个字解码文件时,将会分析字节码文件的魔数版本号常量池类信息类的方法类中的方法信息类变量与成员变量等信息。

2、魔数:所有的.class字节码文件的前4个字节都是魔数,魔数为固定值:0xCAFEBABE

3、魔数之后的4个字节为版本号信息,前两个字节表示minor version(次版本号) 。

4、常量池(constant pool):紧接着主版本号之后就是常量池入口,一个java类中的定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如说java类中的定义的方法与变量信息,都是存储在常量池中。常量池中主要存储两类常量:字面量和符号引用,字面量如文本字符串、java中声明为final的常量值等,而符号引用如类的接口的全局限定名,字段的名称和描述符、方法的名称和描述符等。

5、常量池的总体结构:java类的所对应的常量池主要由常量池与常量数组这两部分共同构成。常量池数量紧跟在主版本后面,占据两个字节。常量池数组则紧跟着常量池数量之后。常量池数组与一般数组不同的是,常量池数组中不同元素的类型、结构都是不同的,长度当然也就不同;但是,每一种元素第一个数据都是一个u1类型,该字节是一个标志位,占据1个字节。JVM在解析常量池时,会根据这个u1类型来获取元素的具体类型。值得注意的是常量池数组中元素的个数 = 常量池数 - 1 (其中0不使用)。目的是满足某些常量池索引值的数据在特定情况下需要表达“不引用任何一个常量池”的含义;根本原因在于,索引为0也是一个常量(保留常量),只不过它不位于常量表中,这个常量就对应null值;所以,常量池从1而非0开始。

6、在JVM中每个字段都有对应的描述信息,描述信息主要的作用是描述字段的数据类型、方法参数列表(包括数量、类型与顺序)与返回值。根据描述规则,基本数据类型和代表无返回值的void类型都用一个大写字符表示,对象类型则使用字符L加对象的全限定名称来表示。为了压缩字节码文件的体积,对于基本数据类型,JVM都只是使用一个大写字母来表示,如下所示:B-byte、C-char、D-double、F-float、I-int、J-long、S-short、Z-boolean、V-void、L-对象类型、如Ljava/lang/String; 对于数组类型来说,每一个维度使用一个前置的[来表示,如int[]被记录为[I,二维数组的String[]()被记录为[[Ljava/lang/String。

7、用描述符来描述方法时,按照先参数列表后返回值的顺序来描述。参数列表按照参数的严格顺序放在一组()之内。如方法:String getRealnamebyIdAndNickname(int id,String name)的描述符为:(I,Ljava/lang/String;)Ljava/lang/String

常量池中11种数据结构1.jpg

上面的表中描述了11种数据类型的结构,其实在jdk1.7之后又增加了3种CONSTANT_MethodHandle_infoCONSTANT_MethodType_info,以及CONSTANT_invokeDynamic_info这样一共14种。
字节码解析图示.jpg

字节码图示.jpg

class文件结构.jpg

class字节码中有两种数据类型:1、字节数据直接量,这是基本的数据类型。共细分为u1、u2、u4、u8四种,分别代表连续的1个字节,2个字节,4 个字节,8个字节组成的整体数据。

表(数组):表是由多个基本数据或其他表按照既定顺序组成的大的数据集合。表是有结构的,它的结构体现在:组成表的成分所在位置和顺序都是已经严格定义好的。


二、访问标志符(access_flags)、当前类名(this.class)、父类(super.class)、接口数量(Interfaces_count)

访问标志符信息包括该class文件是类还是接口,是否被定义成public,是否是abstract如果是类,是否被声明成final.通过上面的源代码,我们知道该文件是类并且是public。
访问标志表.jpg

0x00 02为ACC_PRIVATE。
0x0021:是0x 0021和0x 0001的并集,表示ACC_PUBLIC与ACC_SUPER。


this.class.jpg

三、字段表集合(files)

字段表用于描述类和接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量。


字段表集合.jpg

字段表结构:

    filed_info{
           u2 access_flags;0002
           u2 name_index;0005
           u2 descriptor_index;0006
           u2 attribute_count;0000
           u2 attribute_info attributes[attribute_count]
    
    }
字段表结构字节码.jpg

六、关于方法的结构与解析(Methodsd)

方法结构表.jpg

方法中的每个属性都是一个attribut_info结构。JVM预定义了部分attribute,但是编译器自己也可以实现自己的attribute写入class文件里,供运行使用。不同的attribute通过attribute_name_index来区分。

attribute_info{    
       u2 attribute_name_index;
       u4 attribute_length;
       u1 info [attribute_length]
}   

方法结构图解.jpg

Code结构:code attribute的作用是保存该方法的结构,如所对应的字节码:
code结构.jpg

attribute_length:表示attribute所包含的字节数,不包含attribute_name_indexattribute_length字段。
max_stack:表示这个方法运行的任何时刻所能达到的操作数栈最大的深度。
max_locals:表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。
ode_length:表示该方法所包含的字节码的字节数以及具体的指令码。具体字节码即是该方法被调用时,虚拟机所执行的字节码。
exception_table:这里存放的是异常处理的信息。。
每个exception_table表示由start_pcend_pchandle_pccatch_type组成。
start_pcend_pc表示在code数组中的从start_pcend_pc处(包含start_pc,不包含end_pc)的指令抛出的异常会由这个异常表示来处理。
handle_pc表示处理异常的代码的开始处。catch_type表示会被处理异常类型,它指向常量池里的一个异常类。当catch_type0时,表示处理所有异常。
附加属性:LineNumberTable:这个属性用来表示code数组中的字节码和java代码行数之间的关系。这个属性可以用来在调试的时候定位代码执行的行数。

LineNumberTable_attribute{
    u2 attribute_name_index;
    u2 attribute_length;
    u2 line_number_table_length;
    {
        u2 start_pc;
        u2 line_number;
    }line_number_table[line_number_table_length]
}

方法属性表:

method_info{
    u2 access_flags;
    u2 name_index;
    u2 descriptar_index;
    u2 affributes_count;
    attribute_info attributes[attributes_count]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容