即使设置了ClassWriter(COMPUTE_MAX + COMPUTE_STACK),ASM(来自ObjectWeb)也无法正确计算MaxStack

时间:2010-02-10 08:57:41

标签: java assembly java-bytecode-asm

尝试加载使用ASM生成的类时,我得到了预期的ClassVerifyErrors。在进一步检查时,我可以看到jvm是正确的,并且该方法所讨论的具有无效的MAX_STACK值。奇怪的是我正在使用自动计算堆栈和最大本地选项,所以这应该不是问题... 使用invalid选项的方法非常简单,但结果是字节码错误。

我编写了一个带有预期方法的类,并将我的asm生成的类与javac生成的类进行比较,字节代码匹配,唯一的错误是max stack为0,这是错误的,而javac设置的值为2。

我想避免自己计算最大堆栈/本地人。

1 个答案:

答案 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);