Как просмотреть или получить доступ к значениям параметра метода или объектам с использованием байтового кода ASM?ASM Bytecode Method Параметр Значения
ответ
Учитывая тип параметров метода счета, вы могли бы сделать что-то подобное:
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.
Аргументы метода - это первые несколько локальных переменных. Чтобы получить доступ к первому аргументу arg, мнемоника байт-кода выглядит как aload_0
или iload_0
или lload_0
и т. Д., В зависимости от типа аргумента. Для аргументов, предшествующих четвертому, вы скажете aload 4
и т. Д.
Обратите внимание, что первый аргумент метода экземпляра является ссылкой на this
. Итак, первый аргумент будет локальным # 1, и вы получите его как aload_1
и т. Д.
Однако вы бы сгенерировали байт-код с материалами ASM ... сделайте это. Похоже, вы скажете что-то похожее на mv.visitVarInsn(ALOAD, 0);
, где mv
- ваш MethodVisitor. 0
будет заменен локальным индексом переменной.
Привет, Спасибо за ваш ответ. Можете ли вы привести несколько примеров с использованием ASM? –
Не совсем; я никогда не использовал этот материал, и мне трудно понять, почему * он работает, а тем более * как *, отчасти из-за необузданного злоупотребления посетителем. Похоже, все * - это какой-то посетитель. : P Реальная библиотека генерации байткодов была бы более простой; см. «System.Reflection.Emit» .net. – cHao