2017-07-30 8 views
0

私は、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への参照は、メソッド呼び出しの前にスタックにプッシュされない:

答えて

0

は、5つのパラメータがあります。ただし、第5パラメータとしては、thisへの参照が用いられる。

ので、生成されたバイトコードは、このコードに相当します:

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

このメソッドはBlockクラスの内部にあるか、それはデリバティブだことを意味します。また、blockパラメータは未使用です。