Запросы байт-кода Asm

#java #bytecode #instrumentation #bytecode-manipulation #java-bytecode-asm

#java #байт-код #инструментарий #манипулирование байт-кодом #java-байт-код-asm

Вопрос:

Всем привет, я пытаюсь использовать ASM bytecode Tree Api для выполнения статического анализа для класса. Думаю, у меня есть довольно простой вопрос. В методе, скажем, foobar (), у меня есть список инструкций внутри foobar (в списке, который содержит список). Теперь я хочу проверить, выполняется ли в инструкции под номером 10 функция «barfoo(String args)». Вызывается ли функция «barfoo(String args)».

Также отдельно мне нужно проверить, является ли конкретная инструкция условной.

Спасибо и с уважением, SJ

Примечание: Я уже могу прочитать класс и получить доступ к конкретному методу, который меня интересует, и выполнить итерацию по каждой структуре этого метода.

Решена (см. Комментарии Грега):

     AbstractInsnNode s = ...
    if(s.getType()==AbstractInsnNode.METHOD_INSN){
        MethodInsnNode methodInvocationNode = (MethodInsnNode) s;
        if(methodInvocationNode.name.equals("barfoo"))
        {
            return true;
        }
    }
  

Комментарии:

1. спасибо, Крис …. не знаю, что мы собираемся это сделать …. делаем nw

2. Знаете ли вы, что означают отдельные инструкции JVM? Просто пытаюсь понять, с чего вы начинаете здесь.

3. Да, я знаю…. Я просмотрел руководство по ASM….

4. Тогда в чем вопрос? Учитывая инструкцию со смещением 10, вы должны знать, как определить, вызывает ли байт-код там определенную функцию. Аналогично, учитывая конкретную инструкцию, должно быть тривиально определить, является ли она условной или нет.

5. Правильно, invokespecial — это один из байт-кодов, который может вызывать метод (есть еще несколько). Похоже, вам придется вызывать getType() на вашем командном узле, и если тип METHOD_INSN , то вы можете привести к MethodInsnNode . Оттуда посмотрите на .name , чтобы увидеть название метода.

Ответ №1:

Глядя на ASM javadoc, похоже, что вам придется вызывать getType() на вашем узле команд, и если тип METHOD_INSN , то вы можете привести к MethodInsnNode . Оттуда посмотрите на .name , чтобы увидеть название метода.

Ответ №2:

Простой — как только вы определите, что вы вызвали foobar , начните увеличивать счетчик при каждой посещаемой вами инструкции. При десятом вызове выполните проверку на вызов barfoo .

Комментарии:

1. Ему не нужно запускать код, чтобы посетители могли перейти к классу / методу / инструкциям.