我只读字节码,不覆盖,

我应该使用哪一个:

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

如果不这样做,最好是根本不支持委托,而不是对下一个访问者有不一致的调用.在这种情况下,使用第二个变体,但也清楚地表明这种支持的缺乏,首先只提供没有访问者参数的构造函数,在这两个子类中都提供类访问者子类和方法访问者子类.

Java相关问答推荐

如何让TaskView总是添加特定的列来进行排序?

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

如何在访问完所有文件后加入所有线程?

我无法将附件发送到NetBeans之外

使用Mockito进行的Junit测试失败

Java中的死锁及其重入锁和锁

GSON期间的Java类型擦除

为什么Java编译器不区分不同类型的方法?

有没有更快的方法在N个容器中删除重复项?

如果按钮符合某些期望,如何修改它的文本?

如何在我的世界中为互动增加冷却时间?

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

try 使用类来包含JSON响应

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

IntelliJ IDEA依赖项工具窗口丢失

Java 21中泛型的不兼容更改

如何使用Java对随机生成的字母数字优惠券代码进行过期设置

JOOQ:批处理CRUD操作使用动态表定义,如何?

Java ModbusRTU写寄存器