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

标签 java jvm

我正在尝试使用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/

相关文章:

java - 游戏循环性能问题

java - 从 ConstraintViolationException 中获取信息 - Jersey

java - Selenium 网络自动化中元素不可交互异常

Java 拒绝启动 - 无法为对象堆保留足够的空间

java - EJB3 企业应用程序作为门户和客户端 Web 应用程序 - 架构/设计

Java-错误 : Actual and formal argument lists differ in length

Java G1GC - 卡片表(CT)与 memset (RS)

共享 Linux Web 服务器 (JustHost) 上的 JavaVM

jenkins - Jenkins 调用了多少个 JVM?

tomcat - Apache Tomcat 在我运行时自动关闭