ASM: вывод Java-байт-кода и кода операции
Я пытаюсь написать программу, которая принимает файл .class и собирает все методы файла .class, а также содержимое каждого метода. Вот мой код
public class ClassReaderTest1 {
public static void main(String[] args) throws Exception{
InputStream in = new FileInputStream("*.class");
ClassReader reader = new ClassReader(in);
ClassNode classNode = new ClassNode();
reader.accept(classNode,0);
@SuppressWarnings("unchecked")
final List<MethodNode> methods = classNode.methods;
for(MethodNode m: methods){
InsnList inList = m.instructions;
System.out.println(m.name);
for(int i = 0; i< inList.size(); i++){
System.out.println(" " + Integer.toHexString(inList.get(i).getOpcode()));
}
}
}
}
и вот мой вывод
init>
ffffffff
ffffffff
19
b7
b1
ffffffff
main
ffffffff
ffffffff
b2
12
b6
ffffffff
ffffffff
3
36
ffffffff
ffffffff
b1
ffffffff
В конечном итоге я не хочу печатать эти значения, я просто хочу иметь возможность ссылаться на них в моей программе (я пытаюсь проверить, что я получаю правильные значения). Я получаю методы, как ожидалось, но содержание методов не имеет смысла для меня. На мой взгляд, это не коды операций; в частности, "fffffff" не является кодом операции Java. То, что я хотел бы сделать, это распечатать все методы, как я делал выше, а затем, где у меня есть коды операций, распечатать байт-код Java, затем несколько пробелов, а затем код операции. Например
main
bytecode **
.
.
Файл, который я загружаю в эту программу, состоит только из основного метода, одного оператора println и инициализации переменной int.
У меня вопрос: я делаю что-то не так или просто неправильно интерпретирую свои результаты? Кроме того, как я могу получить байт-код? Я не смог найти способ получить это. Я вижу это, когда использую подключаемый модуль java bytecode для затмения, но мне нужно иметь возможность ссылаться на него в моей программе.
заранее спасибо