Инструкция ALOAD содержит числовой аргумент, который сообщает, какую локальную переменную она загружает. Как только мы получим это, мы посмотрим в methodnode.localVariables
(что вы уже печатали на экране), чтобы найти правильный.
Итак, один из способов - сначала выяснить, какой класс представляет инструкции ALOAD. Вы можете выполнить поиск в Google, например, « aload extends abstractinsnnode site: asm.ow2.io », чтобы найти * InsnNode для использования. Ответ для ALOAD - VarInsnNode . Он, безусловно, содержит поле int var
, в котором содержится номер локальной переменной, которую он загружает. Оно должно соответствовать полю int index
в списке LocalVariableNode
. Однако один и тот же индекс может быть повторно использован для различных целей в одном и том же методе, поэтому вам также необходимо убедиться, что ваша инструкция находится между инструкциями LabelNode, указанными в инструкциях LabelNode start
и LabelNode end
в LocalVariableNode
. Самый простой способ сделать это - просто использовать BasicAnalyer, как рекомендовано @Holger в его комментарии к ответу @Antimony . Таким образом, вы получаете связанный объект Frame для вашего VarInsnNode и делаете frame.getStack(((VarInsnNode) abstractNode).var)
, чтобы получить описание переменной для инструкции ALOAD.
Проверьте документацию Oracle:
можно генерировать вкладку в Oracle при помощи значения ASCII вкладки 9 и функция chr:
select chr(9) from dual;
Один конкретный сценарий, который я украл больше чем в одном случае, прибывает из потока AskTom на данные извлечения к плоскому файлу . Если мне был нужен быстрый и грязный плоский файл из SQL*Plus. Я был бы склонен предпочитать функцию DUMP_CSV, которую Tom отправил раньше что поток для любого вида продолжающегося процесса, все же.