ASM(从对象式)计算不正确地MaxStack即使ClassWriter(COMPUTE_MAX + COMPUTE_STACK)被设定
-
19-09-2019 - |
题
我试图加载我已经使用ASM生成一个类时得到预期ClassVerifyErrors。在进一步的检查,我可以看到的是,JVM是正确的,方法是在谈论具有无效MAX_STACK值。奇怪的是现在用的是自动计算堆栈和最大的本地选项,因此这不应该是一个问题... 与无效的选项的方法是很简单的,但其结果是糟糕的字节码。
我已经写了一类具有预期的方法和比较我的ASM生成针对什么的javac产生和字节代码与唯一的误差为最大堆对决是0,这是错误的,而javac的设置值2类。
Id喜欢避免不必计算THA最大堆叠/当地人自己。
解决方案
最高堆栈和变量计算可产生错误的结果,如果字节码是无效的。您可以验证通过运行生成的代码线槽 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);
不隶属于 StackOverflow