我只读取字节码而不是覆盖,
我应该使用哪一个:
public MethodVisitor visitMethod(...) {
return new MyMethodVisitor(Opcodes.ASM9, super.visitMethod(...));
}
或
public MethodVisitor visitMethod(...) {
return new MyMethodVisitor(Opcodes.ASM9);
}
最佳答案
ASM 的访问者支持链接。当您将另一个类访问者传递给ClassVisitor
constructor时,它将被存储在cv
field中。然后,visitMethod
method将检查该字段,如果非 null
,则委托(delegate)给下一个类访问者并返回 visitMethod
调用返回的任何内容。
因此,当您不链接另一个类访问者时,两种变体的效果将是相同的。 super.visitMethod(...)
调用将返回 null
然后将 null
传递给方法访问者构造函数与调用没有委托(delegate)的构造函数(我假设您的子类构造函数委托(delegate)给 MethodVisitor
的构造函数 1:1)。
如果您想设计类来支持委托(delegate),即使您现在在这个特定场景中没有使用它,您也必须记住 MethodVisitor
的所有重写方法也具有正确调用对应的super
方法。
如果您不这样做,最好根本不支持委派,而不是对下一个访问者进行不一致的调用。在这种情况下,使用第二种变体,但也通过仅在类访问者子类和方法访问者子类中提供不带访问者参数的构造函数来明确缺乏这种支持。
关于java - MethodVisitor的(api, MethodVisitor)构造函数,是否只需要读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73477401/