我只读取字节码而不是覆盖,
我应该使用哪一个:
public MethodVisitor visitMethod(...) {
return new MyMethodVisitor(Opcodes.ASM9, super.visitMethod(...));
}
或
public MethodVisitor visitMethod(...) {
return new MyMethodVisitor(Opcodes.ASM9);
}
ASM的访问者支持链接。当您将另一个类访问者传递给ClassVisitor
构造函数时,它将存储在cv
字段中。然后,visitMethod
方法将检查该字段,如果不是null
,则委托给下一个类访问者,并返回visitMethod
调用返回的任何内容。
因此,当您不链接另一个类访问者时,两种变体的效果将是相同的。super.visitMethod(...)
调用将返回null
,并且将null
传递给方法访问者构造函数与在没有委托的情况下调用构造函数具有相同的效果(我假设您的子类构造函数1:1委托给MethodVisitor
的构造函数(。
如果您想将类设计为支持委派,即使您现在没有在这个特定场景中使用它,也必须记住MethodVisitor
的所有重写方法也必须正确调用相应的super
方法。
如果你不这样做,最好不要支持委派,而不是给下一位访客打不一致的电话。在这种情况下,使用第二个变体,但也要明确缺乏这种支持,首先只提供没有访问者参数的构造函数,在类访问者子类和方法访问者子类中都是这样。