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

标签 java java-bytecode-asm

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

我应该使用哪一个:

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/

相关文章:

java - 在 Java 中,如何迭代接口(interface)的常量?

java - 如何在每次返回之前向消息添加代码?

hadoop - 分析 Hadoop

java - 如何在运行时使用 ASM 5.2 删除方法体

java - 在android中扩展ArrayAdapter

java - 编译java代码错误

java - dup 和 dup_x2 之间的区别

java - 在Java中获取调用特定方法的对象的hashCode()

java - 如何在Spring集成DSL中为 channel 设置多个消息处理程序?

java - 使用 Intellij 2016 创建 Jar - 没有主要 list 属性