2013-10-03 6 views
2

Я пытаюсь написать программу, которая принимает файл .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, но мне нужно иметь возможность ссылаться на него в моей программе.

Заранее благодарен

ответ

10

Мне удалось выяснить это самостоятельно. Я отправляю свое решение, если у кого-то другая проблема. Обратите внимание, что в моей реализации здесь я не распечатываю коды операций (один оператор println - это все, что нужно добавить для этого).

import java.io.InputStream; 
import java.io.FileInputStream; 
import java.io.StringWriter; 
import java.io.PrintWriter; 
import java.util.List; 
import org.objectweb.asm.*; 
import org.objectweb.asm.tree.*; 
import org.objectweb.asm.util.*; 

public class ClassReaderTest1 { 

    public static void main(String[] args) throws Exception{ 
     InputStream in = new FileInputStream("*afile*"); 
     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.print(insnToString(inList.get(i))); 
      } 
     } 
    } 

    public static String insnToString(AbstractInsnNode insn){ 
     insn.accept(mp); 
     StringWriter sw = new StringWriter(); 
     printer.print(new PrintWriter(sw)); 
     printer.getText().clear(); 
     return sw.toString(); 
    } 

    private static Printer printer = new Textifier(); 
    private static TraceMethodVisitor mp = new TraceMethodVisitor(printer); 

} 

и вот вывод, который производится

<init> 
    L0 
    LINENUMBER 1 L0 
    ALOAD 0 
    INVOKESPECIAL java/lang/Object.<init>()V 
    RETURN 
    L1 
main 
    L2 
    LINENUMBER 3 L2 
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream; 
    LDC "Hello World!!!" 
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V 
    L3 
    LINENUMBER 4 L3 
    ICONST_0 
    ISTORE 1 
    L4 
    LINENUMBER 5 L4 
    RETURN 
    L5 
+0

Для чего это стоит, то ClassReader магия обеспечивается http://asm.ow2.org/doc/faq.html Я считаю, – balupton

 Смежные вопросы

  • Нет связанных вопросов^_^