私は、JavaのObjectWeb ASMライブラリ(フレームワーク?)が、ドキュメントを読んで、サンプルコードを調べることでどのように動作するかを理解しようとしています。私はゆっくりとその背後にあるアイデアを得ていますが、理解していないサンプルコードがいくつか見つかりましたので、ここの誰かが私に説明できることを願っています。Java ASM visitMethodInsnパラメータ?
コードがClassWriterのvisitMethod
方法で得られたMethodVisitor、mv
かかり、このような方法で操作を開始:
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);
もちろん、それよりありますが、これは私にはない部分でありますわかる。メソッドのシグネチャからわかるように、Worldクラス、3つの整数、Blockクラスの5つの引数を取ります(そして、署名文字列の変数はこれらのクラスのFQNを保持します)。しかし、新しいメソッド呼び出しが訪れる前に、の4つのパラメータがスタックにプッシュされます(さらに、this
への参照)。では、どこから5番目のパラメータを取得していますか? handleLeafDecay
が静的メソッドである
ので(INVOKESTATIC
オペランドは、それを呼び出すために使用される)、this
への参照は、メソッド呼び出しの前にスタックにプッシュされない: