Disassemblare classi Java con javap
Il JDK arriva con diversi comandi utili a disposizione.
Uno di questi è javap, che permette di disassemblare i file Java compilati (i .class per intenderci).
Vediamo qualche esempio utile:
$ javap Author.class
Compiled from "Author.java"
public class com.mp.book.Author {
public com.mp.book.Author();
public java.lang.String getId();
public void setId(java.lang.String);
public java.lang.String getName();
public void setName(java.lang.String);
public java.lang.String toString();
public boolean equals(java.lang.Object);
public int hashCode();
}
Ovviamente possiamo usare diverse opzioni da passare al comando; ad esempio:
- -l: visualizza il numero di riga e le variabili locali
- -public: visualizza solo i metodi e i membri public
- -protected: visualizza solo i metodi e i membri protected
- -package: opzione di default
- -p: visualizza tutte le classi e membri
- -s: visualizza le signatures
- -sysinfo: mostra alcune informazioni di sistema su cui è stato compilato il sorgente
- -constants: visualizza le costanti final
- -c: visualizza il codice disassemblato
- -verbose: mostra più informazioni
Per fare un altro esempio:
$ javap -c Author.class
Compiled from "Author.java"
public class com.mp.book.Author {
public com.mp.book.Author();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public java.lang.String getId();
Code:
0: aload_0
1: getfield #2 // Field id:Ljava/lang/String;
4: areturn
public void setId(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field id:Ljava/lang/String;
5: return
public java.lang.String getName();
Code:
0: aload_0
1: getfield #3 // Field name:Ljava/lang/String;
4: areturn
public void setName(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #3 // Field name:Ljava/lang/String;
5: return
public java.lang.String toString();
Code:
0: aload_0
1: getfield #3 // Field name:Ljava/lang/String;
4: areturn
public boolean equals(java.lang.Object);
Code:
0: aload_1
1: instanceof #4 // class com/mp/book/Author
4: ifne 9
7: iconst_0
8: ireturn
9: aload_1
10: checkcast #4 // class com/mp/book/Author
13: astore_2
14: aload_0
15: getfield #3 // Field name:Ljava/lang/String;
18: aload_2
19: invokevirtual #5 // Method toString:()Ljava/lang/String;
22: invokevirtual #6 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
25: ireturn
public int hashCode();
Code:
0: iconst_3
1: istore_1
2: bipush 59
4: iload_1
5: imul
6: aload_0
7: getfield #3 // Field name:Ljava/lang/String;
10: ifnull 23
13: aload_0
14: getfield #3 // Field name:Ljava/lang/String;
17: invokevirtual #7 // Method java/lang/String.hashCode:()I
20: goto 24
23: iconst_0
24: iadd
25: istore_1
26: iload_1
27: ireturn
}
Buon disassembler!
Enjoy!
java javap jdk software
Commentami!