2017-07-30 519 views
0

我想了解Java的ObjectWeb ASM庫(框架?)如何通過閱讀文檔和查看示例代碼的組合。我慢慢地意識到它背後的想法,但是我發現了一些我只是不理解的示例代碼,所以我希望這裏有人能向我解釋它。Java ASM visitMethodInsn參數?

代碼獲取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的引用)。那麼它從哪裏得到第五個參數呢?

回答

0

有五個參數:

由於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參數未使用。