我试图通过阅读文档和查看示例代码来了解Java的ObjectWeb ASM库(框架?)是如何工作的。我正在慢慢得到它背后的想法,但我发现了一些我不理解的示例代码,所以我希望有人可以向我解释。
代码采用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个参数:一个World类,三个整数和一个Block类(是的,签名字符串中的那些变量确实为这些类保存了正确的FQN)。然而,在访问新方法调用之前,只有四个参数被压入堆栈(加上对this
的引用)。那么它从哪里获得第五个参数?
有五个参数:
因为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
参数未使用。