我正在操作一个.class文件。我正在使用InstrutionHandle软件包一次获取一条说明。我通过getPosition()方法获得了指令的字节偏移量,我可以从字节偏移量中获取源行号吗?
这取决于类文件是否使用调试信息编译。通常,编译器会插入一个LineNumberTable
属性,该属性给出与每个字节码范围相对应的原始源行号。然而,LineNumberTable
属性只是元数据,因此作者可以在其中放入他们想要的任何内容,只需少量约束,或者完全省略它。(通常通过使用-g: none
进行编译或在其上运行模糊处理程序来完成)
无论如何,属性的格式是整数(2字节),后面是(起始pc,行号)对(均为2字节)。您也可以具有多个LineNumberTable
属性。当然,如果你正在使用一个库,它可能已经为你解码了。