ASM 5:初始化 ClassWriter 时,COMPUTE_MAXS和COMPUTE_FRAMES有什么区别?
我是格拉巴酒的维护者。此包在运行时从 Java 代码生成解析器,方法是使用 ASM 生成扩展解析器类的类。
我已经从ASM 4迁移到ASM 5,从生成JVM 1.5字节码到生成JVM 1.6字节码,现在我刚刚成功地让它生成JVM 1.7字节码...除了我不知道为什么这有效。
基本上,我做了以下工作:
- 将参数更改为 ClassWriter 构造函数;在此之前,它是 ,现在是
new ClassWriter(ClassWriter.COMPUTE_MAXS)
new ClassWriter(ClassWriter.COMPUTE_FRAMES)
- 将每次调用方法的第一个参数从 更改为 。
.visit()
Opcodes.V1_6
Opcodes.V1_7
现在,为什么我不明白为什么它有效,原因有两个:
-
我有几个调用s,内容如下:
MethodVisitor
mv.visitMaxs(0, 0); // trigger automatic computing
这是否意味着可以删除这些说明?
-
起初,我只尝试将参数添加到构造函数中,但是对于我的一个测试,它一度失败了,我声明:
COMPUTE_FRAMES
ClassWriter
static class TestJoinParser extends EventBusParser<Object> { protected final JoinMatcherBuilder builder = join('a').using('b'); }
错误是:
java.lang.ClassFormatError: Arguments can't fit into locals
鉴于它是一个实例字段,我想它与在构造函数中初始化的特定参数有关?
无论如何,我所有的测试现在都有效,我正在尝试更重的测试等......但是,由于我的目标是走得更远,我想至少了解一下为什么我的修改有效......