2017-07-30 6 views
0

Ich versuche zu verstehen, wie Javas ObjectWeb ASM-Bibliothek (Framework?) Durch eine Kombination aus dem Lesen der Dokumentation und dem Betrachten von Beispielcode funktioniert. Ich bekomme langsam die Idee dahinter, aber ich habe ein paar Beispielcodes gefunden, die ich einfach nicht verstehe, also hoffe ich, dass mich jemand hier erklären kann.Java ASM visitMethodInsn Parameter?

Der Code nimmt mv, ein MethodVisitor von einem visitMethod Methode des ClassWriter erhalten, und startet die Methode, wie diese Manipulation:

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

Es gibt mehr zu ihm, natürlich, aber das ist der Teil ich nicht tun verstehen. Wie Sie der Methodensignatur entnehmen können, benötigt es 5 Argumente: eine Weltklasse, drei Ganzzahlen und eine Block-Klasse (und ja, diese Variablen in der Signatur-Zeichenkette enthalten die richtigen FQNs für diese Klassen). Bevor jedoch der neue Methodenaufruf aufgerufen wird, werden nur vier Parameter auf den Stapel geschoben (plus der Verweis auf this). Woher bekommt es den fünften Parameter?

Antwort

0

Es gibt fünf Parameter:

handleLeafDecay Da eine statische Methode ist (INVOKESTATIC Operand verwendet wird, es zu nennen), die Bezugnahme auf this nicht auf dem Stapel vor dem Methodenaufruf geschoben. Die Bezugnahme auf this wird jedoch als der fünfte Parameter verwendet.

So die erzeugte Bytecode würde zu diesem Code entsprechen:

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

, dass diese Methode bedeutet, ist innerhalb Block Klasse oder es ist Derivaten. Auch der Parameter block ist nicht belegt.