ASM: Ausgabe von Java-Bytecode und Opcode
Ich versuche, ein Programm zu schreiben, das eine .class-Datei nimmt und alle Methoden der .class-Datei sowie den Inhalt jeder Methode sammelt. Hier ist mein Code
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()));
}
}
}
}
und hier ist meine Ausgabe
init>
ffffffff
ffffffff
19
b7
b1
ffffffff
main
ffffffff
ffffffff
b2
12
b6
ffffffff
ffffffff
3
36
ffffffff
ffffffff
b1
ffffffff
Letztendlich möchte ich diese Werte nicht drucken, ich möchte sie nur in meinem Programm referenzieren können (ich versuche zu überprüfen, ob ich die richtigen Werte erhalte). Ich bekomme die Methoden wie erwartet, aber der Inhalt der Methoden macht für mich keinen Sinn. Soweit ich weiß, handelt es sich nicht um Opcodes. Insbesondere "fffffff" ist kein Java-Opcode. Was ich tun möchte, ist alle Methoden auszudrucken, wie ich oben getan habe und dann, wo ich jetzt die Opcodes habe, den Java-Bytecode, gefolgt von ein paar Leerzeichen und dann den Opcode auszudrucken. Zum Beispiel
main
bytecode **
.
.
Die Datei, die ich in dieses Programm lade, besteht nur aus einer Hauptmethode, einer einzelnen println-Anweisung und einer Initialisierung einer int-Variablen.
Meine Frage ist dann, mache ich etwas falsch oder interpretiere ich meine Ergebnisse einfach nicht richtig? Wie kann ich den Bytecode erhalten? Ich habe keinen Weg gefunden, es zu bekommen. Ich kann es sehen, wenn ich das Java-Bytecode-Gliederungs-Plugin für Eclipse verwende, aber ich muss es in meinem Programm referenzieren können.
Danke im Voraus