Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ASM visitMethodInsn参数?_Java_Stack_Java Bytecode Asm_Visitor_Invocation - Fatal编程技术网

Java ASM visitMethodInsn参数?

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

我想了解Java的ObjectWebASM库框架是如何实现的?通过阅读文档和查看示例代码的组合工作。我正在慢慢地理解它背后的想法,但是我发现了一些我不理解的示例代码,所以我希望这里的人能给我解释一下

代码获取mv,一个从ClassWriter的visitMethod方法获得的MethodVisitor,并开始如下操作该方法:

    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);
    // ...
}
这意味着该方法在块类或其派生类中。此外,块参数未使用