gpt4 book ai didi

java - 奇怪的 JVM 验证错误 : Mismatched stack types

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:00 25 4
gpt4 key购买 nike

我正在尝试使用asm框架来检测类文件,以便基于运行时的 boolean 标志,对于某些类集,我可以切换基类或其子类是否被实例化(所有这一切都是在用户不知情的情况下透明发生的)。这是我的程序迄今为止生成的一个准 asm 示例。

  public void createInstance();
flags: ACC_PUBLIC
aload_1 //load the string flag
ifnull label_0
new com.example.BaseClass
goto label_1
label_0:
new com.example.SubClass
label_1:
dup
ldc "a"
aload_1 //load the string flag
ifnull label_2:
invokespecial com.example.BaseClass.<init>(java.lang.String)
goto label_3
label_2:
invokespecial com.example.SubClass.<init>(java.lang.String)
label_3:
astore_1
return

问题是 ASM 不会提示生成类文件。但是,当我尝试运行此代码时,JVM 失败并出现以下错误(此处显示部分堆栈跟踪):

 Exception in thread "main" java.lang.VerifyError:  Mismatched stack types
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2446)
at java.lang.Class.getConstructor0(Class.java:2756)
at java.lang.Class.newInstance0(Class.java:328)
at java.lang.Class.newInstance(Class.java:310)

我正在做的事情是 JVM 不可能完成的任务吗?如果不是,我该如何纠正我的错误?

我在网上发现的类似错误:

非常感谢任何帮助!

最佳答案

字节码 validator 在基本 block (内部没有分支指令或分支目标的字节码线性段)上运行。因此,有关确切类(class)的信息位于 label_1丢失:要么是 BaseClassSubClass 。这就是 JVM 无法验证您是否调用了正确的构造函数的原因。

修改代码流以便调用 BaseClass.<init>就在new BaseClass之后和SubClass.<init>就在new SubClass之后中间没有跳转。

关于java - 奇怪的 JVM 验证错误 : Mismatched stack types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25086475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com