javap可以显示与字节码混合的原始源代码行,如objdump -S吗?

时间:2015-06-25 16:49:25

标签: java javap

我知道编译时这个调试信息包含在.class文件中 用:

javac -g Main.java

可以从以下LineNumberTable:部分手动观察:

javap -c -constants -private -verbose '$<' > '$@'

我想要的是让javap在字节码的中间显示源。

示例输入:

public class New {
    public static void main(String[] args) {
        System.out.println(new Integer(1));
    }
}

实际javap输出:

   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: new           #3                  // class java/lang/Integer
   6: dup
   7: iconst_1
   8: invokespecial #4                  // Method java/lang/Integer."<init>":(I)V
  11: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
  14: return
LineNumberTable:
  line 3: 0
  line 4: 14

所需的javap输出:

       System.out.println(new Integer(1));
   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: new           #3                  // class java/lang/Integer
   6: dup
   7: iconst_1
   8: invokespecial #4                  // Method java/lang/Integer."<init>":(I)V
  11: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
    }
  14: return
LineNumberTable:
  line 3: 0
  line 4: 14

这样可以更轻松地解释javap输出。

类似但更通用的问题:How to use javap to see what lines of bytecode correspond to lines in the Java code?

我试过:

但没有回复,我的邮件甚至没有出现在这些网站上。不是一个非常开放的项目。

1 个答案:

答案 0 :(得分:2)

我认为javap不支持这个用例,但过去几天我一直在玩一些类文件解析代码,而且截至今天它能够将源代码与汇编代码混合在一起。有关详细信息和源代码,请参阅https://github.com/gagern/classfile