代码之家  ›  专栏  ›  技术社区  ›  Gian U.

javap输出中缺少指令号

  •  4
  • Gian U.  · 技术社区  · 12 年前

    每次我试图理解编译后的Java文件的反汇编代码时,我都想知道为什么缺少一些指令号。

    一个小例子:

    我拆开了( $ javap -c HelloWorld )一个简单的HelloWorld类。以下是输出:

    Compiled from "HelloWorld.java"
    public class HelloWorld {
      public HelloWorld();
        Code:
           0: aload_0       
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return        
    
      public static void main(java.lang.String[]);
        Code:
           0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
           3: ldc           #3                  // String Hello World!
           5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
           8: return        
    }
    

    如您所见,构造函数中的指令3和4以及主方法中的一些指令缺失。

    有人知道为什么缺少这些指令号吗?是否有一些字节码指令由于某种原因而被隐藏?

    2 回复  |  直到 12 年前
        1
  •  9
  •   fvu    12 年前

    “孔”是当前指令的参数所在的位置,请参见 Java Virtual Machine Specification 。它包含字节码的完整列表 Chapter 6 .

    例如 invokevirtual invokespecial 两者都采用2个参数,因此下一个操作码将在3个字节后找到。在这两种情况下,需要参数(indexbyt1和indexbyt2)来计算常量池中的位置 (indexbyte1 << 8) | indexbyte2)

    Javap为您查找这些值,这是实际指令后注释中的引用。

        2
  •  0
  •   yshavit    12 年前

    这些不是指令号,它们是指令相对于方法的字节偏移量。

    我仍在寻找官方文件,但 this link 证实了这一点。

    推荐文章