java - Java 字节码检测:将顶部转换为引用
问题描述
我在 Java 字节码上进行操作,最终得到了类似于以下简化代码的指令流:
branch_1:
new Foo
astore 42
goto end
branch_2:
new Foo
astore 42
goto end
end:
aload 42
invokespecial Foo.<init>()
也就是说,对 new 的调用发生在不同的分支中,对关联构造函数的调用在第三个分支中“分解”。
运行代码时,Java 会报错,aload 42
因为它无法分辨本地 42: 的类型Type top (current frame, locals[42]) is not assignable to reference type
。到目前为止,我的理解是,本地 42 的类型在一个代码路径中是“在 X 行未初始化”,在另一个代码路径中是“在 Y 行未初始化”,因此是错误消息中的“顶部”。
是否有指令或其他方式告诉 Java aload 42 的结果是对未初始化 Foo 的引用?