Инструкция 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.