字节码和对象

H-H*_*H-H 7 java verification instrumentation bytecode

我正在研究字节码检测项目.目前,在处理对象时,验证程序在大多数情况下都会抛出错误.所以我想清楚地了解有关对象的规则(我阅读了JVMS但找不到我想要的答案):

我正在制定新指令:

原始字节码

NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
Run Code Online (Sandbox Code Playgroud)

仪表后

NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了对Profiler.handleNEW()的调用,该调用将对象引用(新创建的对象)作为参数.

上面的代码抛出VerificationError.如果我不添加INVOKESTATIC(只留下DUP),它就不会.那么我违反的规则是什么?我可以复制一个未初始化的引用,但我不能将其作为参数传递?我将不胜感激任何帮助.谢谢

Arc*_*hie 4

JVM 验证程序将构造函数尚未被调用的对象视为具有称为“未初始化”的特殊编译时类型。

因此,从验证者的角度来看,您将错误类型的对象作为第一个参数传递给Profiler.handleNEW(),因为“未初始化”不被视为 Object 的子类(可以这么说)。

JVM 规范中有关如何定义“未初始化”的相关部分位于此处