MethodVisitor的(api,MethodVisitor)构造函数,是否只需要读取



我只读取字节码而不是覆盖,

我应该使用哪一个:

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方法。

如果你不这样做,最好不要支持委派,而不是给下一位访客打不一致的电话。在这种情况下,使用第二个变体,但也要明确缺乏这种支持,首先只提供没有访问者参数的构造函数,在类访问者子类和方法访问者子类中都是这样。

最新更新