2013-02-15 1 views

Répondre

1

La prise en compte des types de paramètres de méthode, vous pouvez faire quelque chose comme ça:

int off = (access | Opcodes.ACC_STATIC) == 0 ? 0 : 1; 
int opcode = Type.getArgumentTypes(desc)[param + off].getOpcode(Opcodes.IALOAD); 
mv.visitVarIns(opcode, param); 
... 

param est le numéro de paramètre de méthode et access et desc sont des valeurs que vous obtenez de paramètres correspondants de ClassVisitor.html#visitMethod.

1

Les arguments de méthode sont les premières variables locales. Pour accéder au premier argument, le mnémonique bytecode ressemble à aload_0 ou iload_0 ou lload_0 etc, selon le type de l'argument. Pour les arguments passés le quatrième, vous diriez aload 4 etc.

Remarque, le premier argument d'une méthode d'instance est une référence à this. Donc, le premier argument sera local # 1, et vous obtiendrez comme aload_1 etc.

Cependant, vous générez du bytecode avec les trucs ASM ... faites-le. Il semble que vous diriez quelque chose comme mv.visitVarInsn(ALOAD, 0);, où mv est votre MethodVisitor. Le 0 serait remplacé par l'index de variable local.

+0

Salut, Merci pour votre réponse .. Pouvez-vous donner quelques exemples en utilisant ASM? –

+0

Pas vraiment; Je n'ai jamais utilisé les trucs, et j'ai du mal à comprendre * pourquoi * ça marche, encore moins * comment *, en partie à cause de l'abus rampant des visiteurs. On dirait que * tout * est un visiteur de quelque sorte. : P Une vraie bibliothèque de génération de bytecode serait plus simple; voir 'System.Reflection.Emit' de .net. – cHao

Questions connexes