Disassemblare classi Java con javap

Mattepuffo's logo
Disassemblare classi Java con javap

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!


Condividi

Commentami!