Параметры Java ASM visitMethodInsn?

Я пытаюсь понять, как работает библиотека Java ObjectWeb ASM (фреймворк?), Читая документацию и просматривая пример кода. Я постепенно понимаю, что за этим стоит, но я нашел небольшой пример кода, который я просто не понимаю, поэтому я надеюсь, что кто-то здесь сможет мне это объяснить.

Код принимает mv, MethodVisitor, полученный из visitMethod метода ClassWriter, и начинает манипулировать этим методом следующим образом:

    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 аргументов: класс World, три целых числа и класс Block (и да, эти переменные в строке подписи действительно содержат правильные FQN для этих классов). Однако до обращения к вызову нового метода в стек помещаются только четыре параметра (плюс ссылка на this). Так откуда у него пятый параметр?


person IceMetalPunk    schedule 30.07.2017    source источник


Ответы (1)


Всего пять параметров:

Поскольку handleLeafDecay является статическим методом (для его вызова используется операнд INVOKESTATIC), ссылка на this не помещается в стек перед вызовом метода. Однако ссылка на this используется как пятый параметр.

Таким образом, сгенерированный байт-код будет эквивалентен этому коду:

public void generatedMethod(World wolrd, int i1, int i2, int i3, Block block) {
    FldHandler.handleLeafDecay(wolrd, i1, i2, i3, this);
    // ...
}

Это означает, что этот метод находится внутри класса Block или его производных. Также параметр block не используется.

person Adamantium    schedule 21.12.2017