Я пытаюсь написать программу, которая принимает файл .class и собирает все методы файла .class, а также содержимое каждого метода. Вот мой кодASM: вывод байт-кода java и код операции
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 для байт-кода для eclipse, но мне нужно иметь возможность ссылаться на него в моей программе.
Заранее благодарен
Для чего это стоит, то ClassReader магия обеспечивается http://asm.ow2.org/doc/faq.html Я считаю, – balupton