为什么在反编译的构造函数字节码中为“ this”声明局部变量?

问题描述 投票:0回答:1

[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的局部变量声明。

包括此变量声明的原因是什么?它有什么用,特别是因为它看起来无法访问?

java java-bytecode-asm
1个回答
0
投票

L1之后的信息都是描述性的;它不是代码,无法执行,因此其“可到达性”毫无意义。换句话说,即使控制流以某种方式到达了L1,也不会执行这些行,并且即使将它们放在执行的代码中(在这种情况下,位于L0和L1之间),它们也仍然不会执行。

像LINENUMBER指令一样,这些行指定了类文件中的调试信息。调试信息包含在类文件中以支持调试,如果进行调试,调试器将使用该信息。

© www.soinside.com 2019 - 2024. All rights reserved.