这一次,彻底弄懂 Java 字节码文件


这一次,彻底弄懂 Java 字节码文件

文章插图
作者 | 东升的思考
责编 | Elle
不啰嗦,直接从最最简单的一段JAVA源代码开启Java整体字节码分析之旅 。
  
Java 源码文件 package com.dskj.jvm.bytecode; public class MyTest1 {private int a = 1;public intgetA {return a;}public voidsetA(int a) {this.a = a;}}
Java字节码文件
IDEA工具编译代码后,Terminal 终端控制台,进入到生成class文件的目录下 。
执行如下命令:
 javap -verbose com.dskj.jvm.bytecode.MyTest1生成字节码文件内容:
Classfile /.../classes/com/dskj/jvm/bytecode/MyTest.classLast modified Jul 31, 2018; size 489 bytesMD5 checksum bdb537edd2d216ea99d6ce529073ee42Compiled from "MyTest1.java"public class com.dskj.jvm.bytecode.MyTestminor version: 0major version: 52 # JDK最大版本号flags: ACC_PUBLIC, ACC_SUPERConstant pool: ##1 = Methodref #4.#20 // java/lang/Object."<init>":V#2 = Fieldref #3.#21 // com/dskj/jvm/bytecode/MyTest1.a:I#3 = Class #22 // com/dskj/jvm/bytecode/MyTest1#4 = Class #23 // java/lang/Object#5 = Utf8 a#6 = Utf8 I#7 = Utf8 <init>#8 = Utf8 V#9 = Utf8 Code#10 = Utf8 LineNumberTable#11 = Utf8 LocalVariableTable#12 = Utf8 this#13 = Utf8 Lcom/dskj/jvm/bytecode/MyTest1;#14 = Utf8 getA#15 = Utf8 I#16 = Utf8 setA#17 = Utf8 (I)V#18 = Utf8 SourceFile#19 = Utf8 MyTest1.java#20 = NameAndType #7:#8 // "<init>":V#21 = NameAndType #5:#6 // a:I#22 = Utf8 com/dskj/jvm/bytecode/MyTest1#23 = Utf8 java/lang/Object{public com.dskj.jvm.bytecode.MyTest1;descriptor: Vflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":V4: aload_05: iconst_16: putfield #2 // Field a:I9: returnLineNumberTable:line 6: 0line 8: 4LocalVariableTable:Start Length Slot Name Signature0 10 0 this Lcom/dskj/jvm/bytecode/MyTest1;public int getA;descriptor: Iflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield #2 // Field a:I4: ireturnLineNumberTable:line 11: 0LocalVariableTable:Start Length Slot Name Signature0 5 0 this Lcom/dskj/jvm/bytecode/MyTest1;public void setA(int);descriptor: (I)Vflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: aload_01: iload_12: putfield #2 // Field a:I5: returnLineNumberTable:line 15: 0line 16: 5LocalVariableTable:Start Length Slot Name Signature0 6 0 this Lcom/dskj/jvm/bytecode/MyTest1;0 6 1 a I}SourceFile: "MyTest1.java”  Java字节码十六进制
mac操作系统下建议使用 Hex Fiend 工具查看 MyTest1.class 文件的十六进制格式 。
这一次,彻底弄懂 Java 字节码文件

文章插图
十六进制文本如下,便于后续分析使用:
CA FE BA BE 00 00 00 34 00 18 0A 00 04 00 14 09 00 03 00 15 07 00 16 07 00 17 01 00 01 61 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 12 4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 01 00 04 74 68 69 73 01 00 1F 4C 63 6F 6D 2F 64 73 6B 6A 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 3B 01 00 04 67 65 74 41 01 00 03 28 29 49 01 00 04 73 65 74 41 01 00 04 28 49 29 56 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 0C 4D 79 54 65 73 74 31 2E 6A 61 76 61 0C 00 07 00 08 0C 00 05 00 06 01 00 1D 63 6F 6D 2F 64 73 6B 6A 2F 6A 76 6D 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 31 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 03 00 01 00 07 00 08 00 01 00 09 00 00 00 38 00 02 00 01 00 00 00 0A 2A B7 00 01 2A 04 B5 00 02 B1 00 00 00 02 00 0A 00 00 00 0A 00 02 00 00 00 06 00 04 00 08 00 0B 00 00 00 0C 00 01 00 00 00 0A 00 0C 00 0D 00 00 00 01 00 0E 00 0F 00 01 00 09 00 00 00 2F 00 01 00 01 00 00 00 05 2A B4 00 02 AC 00 00 00 02 00 0A 00 00 00 06 00 01 00 00 00 0B 00 0B 00 00 00 0C 00 01 00 00 00 05 00 0C 00 0D 00 00 00 01 00 10 00 11 00 01 00 09 00 00 00 3E 00 02 00 02 00 00 00 06 2A 1B B5 00 02 B1 00 00 00 02 00 0A 00 00 00 0A 00 02 00 00 00 0F 00 05 00 10 00 0B 00 00 00 16 00 02 00 00 00 06 00 0C 00 0D 00 00 00 00 00 06 00 05 00 06 00 01 00 01 00 12 00 00 00 02 00 13
  
Java字节码结构分析前面都是铺垫,来到重磅分析的一节 。
Java字节码整体结构如下图所示,以下图示以不同纬度展示了字节码结构中所包含的关键内容 。
Java字节码整体结构图:
这一次,彻底弄懂 Java 字节码文件

文章插图
完整的Java字节码结构图:
这一次,彻底弄懂 Java 字节码文件

文章插图
接下来结合十六进制格式的 class 文件,参照 Java字节码文件来剖析下都包含了哪些内容 。


推荐阅读