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

mP.*_*mP. 1 java assembly java-bytecode-asm

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

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

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

Eug*_*hov 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);
Run Code Online (Sandbox Code Playgroud)