如何从java中的字节偏移量中获取源代码的行号?

时间:2012-11-22 03:54:39

标签: java bytecode bytecode-manipulation .class-file bcel

我正在操作.class文件。我正在使用InstrutionHandle包来逐个获取说明。我通过getPosition()方法得到了指令的字节偏移量 ,我可以从字节偏移中获取源行号吗?

1 个答案:

答案 0 :(得分:2)

这取决于是否使用调试信息编译了类文件。通常,编译器将插入LineNumberTable属性,该属性给出对应于每个字节码范围的原始源行号。但是,LineNumberTable属性只是元数据,因此作者可以将任何他们想要的东西放在那里但有一些小的约束,或者只是完全省略它。 (通常通过使用-g: none进行编译或在其上运行混淆器来完成)

无论如何,属性的格式是entires(2个字节)的数量,后跟(start pc,line number)对(都是2个字节)。您还可以拥有多个LineNumberTable属性。当然,如果您正在使用库,它可能已经为您解码了这些。