#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. Ему не нужно запускать код, чтобы посетители могли перейти к классу / методу / инструкциям.