首页 > 解决方案 > 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 的引用?

标签: javajvm

解决方案


推荐阅读