如何解读JAVA编译的Class文件(字节码)

如何解读JAVA编译的Class文件(字节码)

首先我们编写一段简单的Java代码并编译

package Lab;

public class ClassDemo {
    private int m;
    
    public int incM(){
        return m+1;
    }
}

编译后得到ClassDemo.class文件

cafe babe 0000 0036 0016 0a00 0400 1209
0003 0013 0700 1407 0015 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 124c 6f63
616c 5661 7269 6162 6c65 5461 626c 6501
0004 7468 6973 0100 0f4c 4c61 622f 436c
6173 7344 656d 6f3b 0100 0469 6e63 4d01
0003 2829 4901 000a 536f 7572 6365 4669
6c65 0100 0e43 6c61 7373 4465 6d6f 2e6a
6176 610c 0007 0008 0c00 0500 0601 000d
4c61 622f 436c 6173 7344 656d 6f01 0010
6a61 7661 2f6c 616e 672f 4f62 6a65 6374
0021 0003 0004 0000 0001 0002 0005 0006
0000 0002 0001 0007 0008 0001 0009 0000
002f 0001 0001 0000 0005 2ab7 0001 b100
0000 0200 0a00 0000 0600 0100 0000 0300
0b00 0000 0c00 0100 0000 0500 0c00 0d00
0000 0100 0e00 0f00 0100 0900 0000 3100
0200 0100 0000 072a b400 0204 60ac 0000
0002 000a 0000 0006 0001 0000 0006 000b
0000 000c 0001 0000 0007 000c 000d 0000
0001 0010 0000 0002 0011 

- 下文中各部分标题含义说明:[ 英文名称 ] [ 类型 ] [ 数量 ] [ 在本文中的数值 ]
- 类型中,u2,u4,u8等通常代表双字节,四字节,八字节,而_info结尾表示复合结构,由多个无符号数或者其他表组成

  1. 魔数
    [magic][u4][1][cafe babe]
    魔数是文件储存中用于身份识别的代号,位于class文件的开头。在java中,java虚拟机所接受的class文件魔数均为cafe babe(也可以理解为java语言编译后得到的class文件魔数均为cafe babe)。
[cafe babe] 0000 0036 0016 0a00 0400 1209
0003 0013 0700 1407 0015 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
  1. 版本号
    [minor_version][u2][1][0000]
    [major_version][u2][1][0036]
    版本号代表了本class文件版本号。前面两个字节代表了次版本号,后面两个字节代表了主版本号。本代码中次版本号为0x0000,主版本号为0x0036,转化为十进制则为:54.0
cafe babe [0000 0036] 0016 0a00 0400 1209
0003 0013 0700 1407 0015 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
  1. 常量池计数器
    [constant_pool_count][u2][1][0016]
    这两个字节代表了常量池计数值。值得注意的是,常量池计数值由1开始计数。在本段代码中,0x0016转化为10进制为22,代表了总计有21个常量,索引值范围为0~21。
cafe babe 0000 0036 [0016] 0a00 0400 1209
0003 0013 0700 1407 0015 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
  1. 常量池
    [constant_pool][cp_info][constant_pool_count-1][0a00及之后]
cafe babe 0000 0036 0016 [0a00 0400 1209
0003 0013 0700 1407 0015 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值