2017-07-30 4 views
0

J'essaie de comprendre comment la bibliothèque ObjectWeb ASM de Java (framework?) Fonctionne en combinant la lecture de la documentation et la recherche d'exemples de code. Je comprends peu à peu l'idée, mais j'ai trouvé un exemple de code que je ne comprends pas, alors j'espère que quelqu'un ici pourra me l'expliquer.Java ASM paramètres VisitMethodInsn?

Le code prend mv, un MethodVisitor obtenu à partir d'une méthode de ClassWriter visitMethod, et commence la manipulation de la méthode comme ceci:

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); 

Il y a plus à lui, bien sûr, mais cela est la partie que je ne suis pas comprendre. Comme vous pouvez le voir à partir de la signature de la méthode, elle prend 5 arguments: une classe World, trois entiers et une classe Block (et oui, ces variables dans la chaîne de signature contiennent les FQN appropriés pour ces classes). Cependant, avant que la nouvelle invocation de méthode ne soit visitée, seuls les paramètres quatre sont poussés sur la pile (plus la référence à this). Alors, d'où vient le cinquième paramètre?

Répondre

0

Il y a cinq paramètres:

Parce que handleLeafDecay est une méthode statique (INVOKESTATIC opérande est utilisé pour appeler), la référence à this n'est pas poussé sur la pile avant l'appel de la méthode. Cependant, la référence à this est utilisée comme cinquième paramètre.

Ainsi, le bytecode généré serait équivalent à ce code:

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

Cela signifie que cette méthode est à l'intérieur Block classe ou il est dérivés. Le paramètre block est également inutilisé.