为什么在反编译构造函数字节代码中为 "this" 进行局部变量声明?



ASM 4.0 用户指南描述了默认公共构造函数的字节码

ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN

我想复制它,使用默认的公共构造函数创建我自己的类,并对其进行反编译。为构造函数生成的字节代码如下所示:

L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom/example/EmptyFixture; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1

我的理解是,与用户指南匹配的标签L0下嵌套的所有内容都会被执行。在RETURN之后有无法访问的代码,嵌套在标签L1下,它只是一个局部变量声明this与类的类型。

包含此变量声明的原因是什么?它的用途是什么,尤其是因为它看起来无法访问?

L1 之后的信息都是描述性的;它不是代码,不能执行,所以它的"可达性"是没有意义的。换句话说,即使控制流以某种方式到达 L1,这些行也不会被执行,如果将它们放在执行的代码中,在这种情况下在 L0 和 L1 之间,它们仍然不会被执行。

与 LINENUMBER 指令一样,这些行指定类文件中的调试信息。调试信息包含在类文件中以支持调试,调试器在调试时会使用它。

最新更新