在创建ClassWriter对象时,使用了ClassWriter.COMPUTE_FRAMES选项。
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
使用ClassWriter.COMPUTE_FRAMES后,ASM会自动计算max stacks、max locals和stack map frames的具体值。从代码的角度来说,使用ClassWriter.COMPUTE_FRAMES,会忽略我们在代码中visitMaxs()方法和visitFrame()方法传入的具体参数值;换句话说,无论我们传入的参数值是否正确,ASM会帮助我们从新计算一个正确的值,代替我们在代码中传入的参数。
- 第1种情况,在创建ClassWriter对象时,flags参数使用ClassWriter.COMPUTE_FRAMES值,在调用mv.visitMaxs(0, 0)方法之后,仍然能得到一个正确的.class文件。
- 第2种情况,在创建ClassWriter对象时,flags参数使用0值,在调用mv.visitMaxs(0, 0)方法之后,得到的.class文件就不能正确运行。
需要注意的是,在创建ClassWriter对象时,flags参数使用ClassWriter.COMPUTE_FRAMES值,我们可以给visitMaxs()方法传入一个错误的值,但是不能省略对于visitMaxs()方法的调用。如果我们省略掉visitCode()和visitEnd()方法,生成的.class文件也不会出错;当然,并不建议这么做。但是,如果我们省略掉对于visitMaxs()方法的调用,生成的.class文件就会出错。
如果省略对于visitMaxs()方法的调用,会出现如下错误:
Exception in thread "main" java.lang.VerifyError: Operand stack overflow
网友评论