我正在进行字节码注入项目。目前在处理对象时,验证器大多数情况下会抛出错误。因此,我希望明确有关对象规则的事项(我阅读了JVMS,但没有找到我要寻找的答案):
我正在对NEW指令进行注入:
原始字节码
NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
仪器化之后
NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>
请注意,我添加了一个调用 Profiler.handleNEW() 的方法,并将新创建的对象作为参数传递。
上面的代码片段会抛出 VerificationError。如果我不添加 INVOKESTATIC(只留下 DUP),它就不会抛出异常。那么我违反了什么规则呢?我可以复制一个未初始化的引用,但是不能将其作为参数传递吗?我将非常感激任何帮助。谢谢!