我想知道为什么Java Bytecode的行号不连续。

例如,在以下 getter 的(未列出)第 2 行和第 3 行中会发生什么?

public java.lang.String getX();

Code:
0:   aload_0
1:   getfield        #2; //Field x:Ljava/lang/String;
4:   areturn

我正在使用 ASM 框架来处理字节码。当使用树 API 访问方法的代码时,我也会得到这些“隐藏”指令(但是使用操作码 -1)。我想知道它们是干什么用的。

最佳答案

我不认为 0, 1, 4 是行号,而是字节码中的字节偏移量。

  • aload_0 是一个字节
  • getfield 是三个字节(一个操作码,一个带有两个字节的“索引”参数“
  • areturn 是一个字节

  • 所以 23 只是 getfield 操作的一部分。

    10-07 12:57
    查看更多