2013-02-15 3 views

ответ

1

Учитывая тип параметров метода счета, вы могли бы сделать что-то подобное:

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

где param является метод номер параметра и access и desc является значением, которые вы получаете от соответствующих параметров ClassVisitor.html#visitMethod.

1

Аргументы метода - это первые несколько локальных переменных. Чтобы получить доступ к первому аргументу arg, мнемоника байт-кода выглядит как aload_0 или iload_0 или lload_0 и т. Д., В зависимости от типа аргумента. Для аргументов, предшествующих четвертому, вы скажете aload 4 и т. Д.

Обратите внимание, что первый аргумент метода экземпляра является ссылкой на this. Итак, первый аргумент будет локальным # 1, и вы получите его как aload_1 и т. Д.

Однако вы бы сгенерировали байт-код с материалами ASM ... сделайте это. Похоже, вы скажете что-то похожее на mv.visitVarInsn(ALOAD, 0);, где mv - ваш MethodVisitor. 0 будет заменен локальным индексом переменной.

+0

Привет, Спасибо за ваш ответ. Можете ли вы привести несколько примеров с использованием ASM? –

+0

Не совсем; я никогда не использовал этот материал, и мне трудно понять, почему * он работает, а тем более * как *, отчасти из-за необузданного злоупотребления посетителем. Похоже, все * - это какой-то посетитель. : P Реальная библиотека генерации байткодов была бы более простой; см. «System.Reflection.Emit» .net. – cHao