概述

.java 文件被编译器编译为 .class 文件,.class 文件具有特定的数据结构,如下表所示:ClassFile文件结构.png
每个 .class 文件都是以上表进行排序。

解析一个 .class 文件

使用 javap -verbose 命令可以查看 .class 文件的字节码:

  1. Classfile /E:/01_Code/Clarence_Code/Algorithm/output/zuo/Jvm.class
  2. Last modified 2021-7-12; size 587 bytes
  3. MD5 checksum 23bdf14592c29c18f8829d63ea6a70fb
  4. Compiled from "Jvm.java"
  5. public class zuo.Jvm
  6. minor version: 0
  7. major version: 52
  8. flags: ACC_PUBLIC, ACC_SUPER
  9. Constant pool:
  10. #1 = Methodref #6.#23 // java/lang/Object."<init>":()V
  11. #2 = Fieldref #24.#25 // java/lang/System.out:Ljava/io/PrintStream;
  12. #3 = Class #26 // zuo/Jvm
  13. #4 = String #27 // Hello World
  14. #5 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V
  15. #6 = Class #30 // java/lang/Object
  16. #7 = Utf8 HELLO_WORLD
  17. #8 = Utf8 Ljava/lang/String;
  18. #9 = Utf8 ConstantValue
  19. #10 = Utf8 <init>
  20. #11 = Utf8 ()V
  21. #12 = Utf8 Code
  22. #13 = Utf8 LineNumberTable
  23. #14 = Utf8 LocalVariableTable
  24. #15 = Utf8 this
  25. #16 = Utf8 Lzuo/Jvm;
  26. #17 = Utf8 main
  27. #18 = Utf8 ([Ljava/lang/String;)V
  28. #19 = Utf8 args
  29. #20 = Utf8 [Ljava/lang/String;
  30. #21 = Utf8 SourceFile
  31. #22 = Utf8 Jvm.java
  32. #23 = NameAndType #10:#11 // "<init>":()V
  33. #24 = Class #31 // java/lang/System
  34. #25 = NameAndType #32:#33 // out:Ljava/io/PrintStream;
  35. #26 = Utf8 zuo/Jvm
  36. #27 = Utf8 Hello World
  37. #28 = Class #34 // java/io/PrintStream
  38. #29 = NameAndType #35:#36 // println:(Ljava/lang/String;)V
  39. #30 = Utf8 java/lang/Object
  40. #31 = Utf8 java/lang/System
  41. #32 = Utf8 out
  42. #33 = Utf8 Ljava/io/PrintStream;
  43. #34 = Utf8 java/io/PrintStream
  44. #35 = Utf8 println
  45. #36 = Utf8 (Ljava/lang/String;)V
  46. {
  47. public zuo.Jvm();
  48. descriptor: ()V
  49. flags: ACC_PUBLIC
  50. Code:
  51. stack=1, locals=1, args_size=1
  52. 0: aload_0
  53. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  54. 4: return
  55. LineNumberTable:
  56. line 3: 0
  57. LocalVariableTable:
  58. Start Length Slot Name Signature
  59. 0 5 0 this Lzuo/Jvm;
  60. public static void main(java.lang.String[]);
  61. descriptor: ([Ljava/lang/String;)V
  62. flags: ACC_PUBLIC, ACC_STATIC
  63. Code:
  64. stack=2, locals=1, args_size=1
  65. 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  66. 3: ldc #4 // String Hello World
  67. 5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  68. 8: return
  69. LineNumberTable:
  70. line 7: 0
  71. line 8: 8
  72. LocalVariableTable:
  73. Start Length Slot Name Signature
  74. 0 9 0 args [Ljava/lang/String;
  75. }
  76. SourceFile: "Jvm.java"