Я пытаюсь понять, как работает библиотека 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
). Так откуда у него пятый параметр?