Java ASM visitMethodInsn参数?
我想了解Java的ObjectWebASM库框架是如何实现的?通过阅读文档和查看示例代码的组合工作。我正在慢慢地理解它背后的想法,但是我发现了一些我不理解的示例代码,所以我希望这里的人能给我解释一下 代码获取mv,一个从ClassWriter的visitMethod方法获得的MethodVisitor,并开始如下操作该方法:Java ASM visitMethodInsn参数?,java,stack,java-bytecode-asm,visitor,invocation,Java,Stack,Java Bytecode Asm,Visitor,Invocation,我想了解Java的ObjectWebASM库框架是如何实现的?通过阅读文档和查看示例代码的组合工作。我正在慢慢地理解它背后的想法,但是我发现了一些我不理解的示例代码,所以我希望这里的人能给我解释一下 代码获取mv,一个从ClassWriter的visitMethod方法获得的MethodVisitor,并开始如下操作该方法: mv.visitCode(); String methodSignature = "(L" + worldClass + ";IIIL" + blockCl
mv.visitCode();
String methodSignature = "(L" + worldClass + ";IIIL" + blockClass + ";)V";
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(81, l0);
mv.visitVarInsn(ALOAD, 1);
mv.visitVarInsn(ILOAD, 2);
mv.visitVarInsn(ILOAD, 3);
mv.visitVarInsn(ILOAD, 4);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESTATIC, "com/olafski/fastleafdecay/FldHandler", "handleLeafDecay", methodSignature);
当然还有很多,但这是我不明白的部分。从方法签名中可以看到,它包含5个参数:一个世界类、三个整数和一个块类。是的,签名字符串中的这些变量确实包含这些类的正确FQN。然而,在访问新方法调用之前,只有四个参数被推送到堆栈上,加上对它的引用。那么第五个参数是从哪里来的呢?有五个参数: 因为handleLeafDecay是一个静态方法INVOKESTATIC操作数用于调用它,所以在方法调用之前不会将对它的引用推送到堆栈上。但是,对它的引用被用作第五个参数 因此,生成的字节码将等效于此代码:
public void generatedMethod(World wolrd, int i1, int i2, int i3, Block block) {
FldHandler.handleLeafDecay(wolrd, i1, i2, i3, this);
// ...
}
这意味着该方法在块类或其派生类中。此外,块参数未使用