深入理解JVM之--字节码

素颜马尾好姑娘i 2023-07-11 06:20 88阅读 0赞

上篇讲到栈帧,现在我们需要了解栈帧的执行过程,那就涉及到反编译字节码。

一. 反编译代码

(1)源代码

  1. /**
  2. * 编译:javac com\jvm\StackFrame.java
  3. * 反编译:javap -p -v com\jvm\StackFrame.class
  4. */
  5. public class StackFrame {
  6. public static void main(String[] args) {
  7. add(1, 2);
  8. }
  9. private static int add(int a, int b) {
  10. int c = 0;
  11. c = a + b;
  12. return c;
  13. }
  14. }

(2)反编译后的字节码,不懂没关系,接下来进行字节码解释。

  1. {
  2. public com.jvm.StackFrame();
  3. descriptor: ()V
  4. flags: ACC_PUBLIC
  5. Code:
  6. stack=1, locals=1, args_size=1
  7. 0: aload_0
  8. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  9. 4: return
  10. LineNumberTable:
  11. line 7: 0
  12. public static void main(java.lang.String[]);
  13. descriptor: ([Ljava/lang/String;)V
  14. flags: ACC_PUBLIC, ACC_STATIC
  15. Code:
  16. stack=2, locals=1, args_size=1
  17. 0: iconst_1
  18. 1: iconst_2
  19. 2: invokestatic #2 // Method add:(II)I
  20. 5: pop
  21. 6: return
  22. LineNumberTable:
  23. line 9: 0
  24. line 10: 6
  25. private static int add(int, int);
  26. descriptor: (II)I
  27. flags: ACC_PRIVATE, ACC_STATIC
  28. Code:
  29. stack=2, locals=3, args_size=2
  30. 0: iconst_0
  31. 1: istore_2
  32. 2: iload_0
  33. 3: iload_1
  34. 4: iadd
  35. 5: istore_2
  36. 6: iload_2
  37. 7: ireturn
  38. LineNumberTable:
  39. line 13: 0
  40. line 14: 2
  41. line 15: 6
  42. }

2. 字节码解释

(1)# 方法描述
# 括号内为入数类型,这里为两个 int 型入参
# 括号外为返回类型,这里为返回 int 型
descriptor: (II)I

# 方法类型,这里为私有的静态方法
flags: ACC_PRIVATE, ACC_STATIC

# 操作数栈为 2
# 本地变量容量为 3
# 入参个数为 2
stack=2, locals=3, args_size=2

执行 add(1,2) 的过程,最后 ireturn 会将操作数栈栈顶的值返回给调用者

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3k1MzI3OTgxMTM_size_16_color_FFFFFF_t_70

代码行号与字节码行号的对应关系

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3k1MzI3OTgxMTM_size_16_color_FFFFFF_t_70 1

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读