我正在尝试使用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 不可能完成的任务吗?如果不是,我该如何纠正我的错误?
我在网上发现的类似错误:
- http://objectmix.com/java/158464-strange-verifier-semantics.html
- JVM 规范:http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#9839
非常感谢任何帮助!
最佳答案
字节码 validator 在基本 block (内部没有分支指令或分支目标的字节码线性段)上运行。因此,有关确切类(class)的信息位于 label_1
丢失:要么是 BaseClass
或SubClass
。这就是 JVM 无法验证您是否调用了正确的构造函数的原因。
修改代码流以便调用 BaseClass.<init>
就在new BaseClass
之后和SubClass.<init>
就在new SubClass
之后中间没有跳转。
关于java - 奇怪的 JVM 验证错误 : Mismatched stack types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25086475/