【问题标题】:Why is a local variable declaration for "this" in decompiled constructor byte code?为什么反编译的构造函数字节码中“this”的局部变量声明?
【发布时间】:2020-02-18 00:43:03
【问题描述】:

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】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2023-03-12
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多