[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指令一样,这些行指定了类文件中的调试信息。调试信息包含在类文件中以支持调试,如果进行调试,调试器将使用该信息。