Java字节码结构解析

本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解。建议先阅读Java类文件结构解析这篇文章。

Test.java

package org.tianbin.clazz;

public class Test{
    private int m;

    public int inc(){
        return m + 1;
    }
}

Test.class

CA FE BA BE 00 00 00 34 00 13 0A 00 04 00 0F 09 00 03 00 10 07 00 
11 07 00 12 01 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 74 3E 01 
00 03 28 29 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E 75 6D 
62 65 72 54 61 62 6C 65 01 00 03 69 6E 63 01 00 03 28 29 49 01 00 
0A 53 6F 75 72 63 65 46 69 6C 65 01 00 09 54 65 73 74 2E 6A 61 76 
61 0C 00 07 00 08 0C 00 05 00 06 01 00 16 6F 72 67 2F 74 69 61 6E 
62 69 6E 2F 63 6C 61 7A 7A 2F 54 65 73 74 01 00 10 6A 61 76 61 2F 
6C 61 6E 67 2F 4F 62 6A 65 63 74 00 21 00 03 00 04 00 00 00 01 00 
02 00 05 00 06 00 00 00 02 00 01 00 07 00 08 00 01 00 09 00 00 00 
1D 00 01 00 01 00 00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00 
00 06 00 01 00 00 00 03 00 01 00 0B 00 0C 00 01 00 09 00 00 00 1F 
00 02 00 01 00 00 00 07 2A B4 00 02 04 60 AC 00 00 00 01 00 0A 00 
00 00 06 00 01 00 00 00 07 00 01 00 0D 00 00 00 02 00 0E

魔数

CA FE BA BE

class文件的头4个字节,用于验证该文件是否能够被虚拟机接受

主次版本号

00 00 00 34

魔数后4个字节,第5个和第6个字节是次版本号(Minor Version),第7个和第8个字节是主版本号(Major Version),Test.java文件使用JDK1.8进行编译,所以主版本号为00 34,十进制表示为52。

常量池

结构:容量计数器(u2类型) + 常量

00 13

容量计算器,计数从1开始,目的是满足某些常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池”的含义。当前容量计算器值为19,表示常量池中有18项常量,索引值范围为1~18。

常量1

0A 
00 04           //java/lang/Object      
00 0F           //<init>
字节码 结构 含义
0A tag 值为10,CONSTANT_Methodref_info
00 04 index 指向声明方法的类描述符CONSTANT_Class_info的索
00 0F index 指向名称及类型描述符CONSTANT_NameAndType的索引项

常量2

09 
00 03       //org/tianbin/clazz/Test
00 10       //m
字节码 结构 含义
09 tag 值为9,CONSTANT_Fieldref_info
00 03 index 指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
00 10 index 指向字段描述符CONSTANT_NameAndType的索引项

常量3

07          
00 11       //常量17      org/tianbin/clazz/Test
字节码 结构 含义
07 tag 值为7,CONSTANT_Class_info
00 11 index 指向全限定名常量项的索引

常量4

07 
00 12       //常量18      java/lang/Object

结构见常量3

常量5

01 
00 01
6D      //m
字节码 结构 含义
01 tag 值为1,CONSTANT_Utf8_info
00 01 length UTF-8编码字符串占用的字节数
6D bytes 长度为length的UTF-8编码的字符串

常量6

01 
00 01
49      //I

结构见常量5

常量7

01
00 06
3C 69 6E 69 74 3E   //<init>

结构见常量5

常量8

01 
00 03
28 29 56    //()V

结构见常量5

常量9

01 
00 04 
43 6F 64 65     //Code

结构见常量5

常量10

01 
00 0F 
4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65    //LineNumberTable

结构见常量5

常量11

01      
00 03
69 6E 63    //inc

结构见常量5

常量12

01      
00 03
28 29 49    //()I

结构见常量5

常量13

01      
00 0A
53 6F 75 72 63 65 46 69 6C 65   //SourceFile

结构见常量5

常量14

01 
00 09
54 65 73 74 2E 6A 61 76 61  //Test.java 

结构见常量5

常量15

0C  
00 07   
00 08
字节码 结构 含义
0C tag 值为12,CONSTANT_NameAndType_info
00 07 index 指向该字段或方法名称常量的索引
00 08 index 指向该字段或方法描述符常量项的索引

常量16

0C  
00 05
00 06

结构见常量15

常量17

01      
00 16
6F 72 67 2F 74 69 61 6E 62 69 6E 2F 63 6C 61 7A 7A 2F 54 65 73 74   //org/tianbin/clazz/Test    

结构见常量5

常量18

01      
00 10
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74     //java/lang/Object      

结构见常量5

访问标志

00 21

常量池之后两个字节标识类的访问标志,用于识别一些类或者接口层次的访问信息。

类索引、父类索引、接口索引

00 03   类索引         //org/tianbin/clazz/Test
00 04   父类索引        //java/lang/Object      
00 00   接口索引集合大小

字段表集合

00 01   fields_count
00 02   access_flags
00 05   name_index          //m
00 06   descriptor_index
00 00   attributes_count

方法表集合

00 02           method_count        //<init>  inc

init

字节码 结构名称 含义
00 01 access_flag
00 07 name_index <init>
00 08 descriptor_index
00 01 attributes_count
00 09 attributes_name_index Code
00 00 00 1D attribute_length
00 01 max_stack
00 01 max_local
00 00 00 05 code_length
2A B7 00 01 B1 code
00 00 exception_table_length
00 01 attributes_count
00 0A attributes_name_index LineNumberTable
00 00 00 06 attribute_length
00 01 line_number_table_length
00 00 start_pc
00 03 line_number

inc

字节码 结构名称 含义
00 01 access_flag
00 0B name_index inc
00 0C descriptor_index
00 01 attributes_count
00 09 attributes_name_index Code
00 00 00 1F attribute_length
00 02 max_stack
00 01 max_local
00 00 00 07 code_length
2A B4 00 02 04 60 AC code
00 00 exception_table_length
00 01 attributes_count
00 0A attributes_name_index LineNumberTable
00 00 00 06 attribute_length
00 01 line_number_table_length
00 00 start_pc
00 07 line_number

Class文件的属性表

00 01属性表的大小

SourceFile属性

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 本文是《深入理解Java虚拟机》中类文件结构一章的读书笔记。另外,推荐阅读Java字节码结构解析来加深理解。 Cl...
    tianbin阅读 2,441评论 0 6
  • 人的一生,没有谁事事得意,处处风光。 告诉自己,淡然一些,看开一点, 生活的过程中保持一种平常心态, 淡然而简单,...
    风芷阅读 519评论 0 2
  • 1 公园里的鸟。情人节的早上到公园里跑步。又路过那个亭子,记得我在一篇文章里说到倦鸟归巢的那个亭子吗, 就是那里。...
    柳二白阅读 191评论 0 2