байт-код и ASM

Здесь ссылка на инструкцию байт-кода INVOKESPECIAL. Если у меня есть AbstractInsnNode из среды ASM, содержащий инструкцию INVOKESPECIAL, будет ли мой узел включать спецификацию метода инструкции? Например, с таким кодом:

String ins = insn.toString;

Если бы в insn была инструкция INVOKESPECIAL, в моих ins была бы строка вроде «invokespecial java/lang/StringBuffer/()V»?

Что я хочу сделать, так это получить спецификацию метода из инструкции INVOKESPECIAL и сохранить ее в строке, чтобы моя программа могла ее прочитать.


person user1912475    schedule 14.01.2013    source источник


Ответы (2)


Вы хотите читать класс во время выполнения? попробуй это

    import org.objectweb.asm.ClassReader;
    import org.objectweb.asm.util.ASMifierClassVisitor;


    ClassReader cr = new ClassReader(b);
    cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0);
person farmer1992    schedule 14.01.2013

Если у меня есть AbstractInsnNode из среды ASM, содержащий инструкцию INVOKESPECIAL, будет ли мой узел включать спецификацию метода инструкции?

АФАИК, да. Это должен быть экземпляр MethodInsnNode. а поле desc должно быть строкой дескриптора метода.

Если бы в insn была инструкция INVOKESPECIAL, в моих ins была бы строка вроде «invokespecial java/lang/StringBuffer/()V»?

На самом деле там три компонента. Строка дескриптора метода, имя метода и внутреннее имя класса, которому принадлежит (в данном случае фактический) метод.

person Stephen C    schedule 14.01.2013
comment
поэтому, если я преобразую переменную methodinsnnode в строку, я смогу использовать такой метод, как .contains(lang), чтобы найти слово lang в дескрипторе? - person user1912475; 14.01.2013
comment
Звучит как плохая идея. Вы должны иметь возможность привести объект к MethodInsnNode, а затем получить доступ к информации через объявленные поля. Немного неясно, какую информацию вы на самом деле ищете, но, похоже, вам нужно имя типа, объявляющего метод, а не сигнатура метода. (К сожалению, некоторые аспекты вашего Вопроса не имеют смысла.) - person Stephen C; 15.01.2013
comment
Позвольте мне попытаться объяснить: я просто хочу сохранить в строке дескриптор (где находится имя суперкласса, вызываемого инструкцией invokespecial), чтобы моя программа могла в конечном итоге прочитать эту строку и узнать, был ли вызван метод для обработки исключения. - person user1912475; 15.01.2013