ASM: Как найти тип объекта, содержащегося в ALOAD - PullRequest
0 голосов
/ 03 марта 2019

Давайте рассмотрим, что у меня есть AbstractInsnNode типа ALOAD.Этот ALOAD содержит объект Exception, ссылаясь на байт-код файла класса.Я хочу знать описание ALOAD с использованием ASM Java.Используя LocalVariableNode, (то, что я сделал, я пробежал через methodNode и нашел имя и переменные localvariables.Но не знаю, связываться с соответствующим ALOAD.

for ( Object a: methodnode.localVariables) {
        LocalVariableNode lvn = (LocalVariableNode)a;
        System.out.println(lvn.desc);
    }


if ((abstractNode.getOpcode() == Constant.ALOAD)) {
           //do Something to check the desc of the ALOAD
            return;
  }

Пожалуйста, помогите мне в этом.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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

0 голосов
/ 03 марта 2019

Java-байт-код неявно типизирован, поэтому нет прямого способа найти типы значений в байт-коде.Вы должны выполнить анализ потока данных, чтобы найти, где было создано значение, и получить тип таким образом.Если у класса есть стековые карты, вам просто нужно отследить его до предыдущей стековой карты, но он все равно потребует кучу работы.

...