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