尝试加载使用ASM生成的类时,我得到了预期的ClassVerifyErrors。在进一步检查时,我可以看到jvm是正确的,并且该方法所讨论的具有无效的MAX_STACK值。奇怪的是我正在使用自动计算堆栈和最大本地选项,所以这应该不是问题... 使用invalid选项的方法非常简单,但结果是字节码错误。
我编写了一个带有预期方法的类,并将我的asm生成的类与javac生成的类进行比较,字节代码匹配,唯一的错误是max stack为0,这是错误的,而javac设置的值为2。
我想避免自己计算最大堆栈/本地人。
答案 0 :(得分:6)
如果字节码无效,则最大堆栈和变量计算会产生错误的结果。您可以通过CheckClassAdapter运行生成的代码来验证这一点。
例如,
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);