我正在做一个字节码检测项目。目前在处理对象时,验证器大部分时间都会抛出错误。所以我想弄清楚关于对象规则的事情(我阅读了 JVMS 但找不到我正在寻找的答案):
我正在检测新指令:
原始字节码
NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
仪器后
NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>
请注意,我添加了对 Profiler.handleNEW() 的调用,该调用将对象引用(新创建的对象)作为参数。
上面的代码会引发 VerificationError。如果我不添加 INVOKESTATIC(只留下 DUP),它不会。那么我违反的规则是什么?我可以复制一个未初始化的引用,但我不能将它作为参数传递?我将不胜感激任何帮助。谢谢