Skip to main content

javap, el descompilador que viene con java

Posted in

 javap es un descompilador que viene con la distribución de java de sun. Pasándole un .class compilado, podemos obtener, más o menos, el código fuente. Digo más o menos porque no obtenemos el código fuente, sólo nos vale para hacernos una idea de lo que hay dentro del .class.

La forma sencilla de llamarlo, javap clase, símplemente nos da un listado de métodos en la clase. Por ejemplo, si tenemos una clase chuidiang.DialogoContacto (en un fichero DialogoContacto.class), obtendremos lo siguiente

C:\> javap chuidiang.DialogoContacto
Compiled from "DialogoContacto.java"
public class chuidiang.DialogoContacto extends javax.swing.JDialog{
    public chuidiang.DialogoContacto(javax.swing.JFrame, java.lang.String);
    public void setContacto(chuidiang.agenda.modelo.Contacto);
    public chuidiang.agenda.modelo.Contacto getContacto();
    public void addActionListener(java.awt.event.ActionListener);
}

Si queremos algo más, podemos poner la opción -c, con lo que veremos lo que hace cada método, pero de una forma un poco extraña

C:\> javap -c chuidiang.DialogoContacto
Compiled from "DialogoContacto.java"
public class chuidiang.DialogoContacto extends javax.swing.JDialog{
public chuidiang.DialogoContacto(javax.swing.JFrame, java.lang.String);
  Code:
   0:	aload_0
   1:	aload_1
   2:	aload_2
   3:	invokespecial	#1; //Method javax/swing/JDialog.">init<":(Ljava/awt/Frame;Ljava/lang/String;)V
   6:	aload_0
   7:	invokespecial	#2; //Method construyePanel:()V
   10:	return

public void setContacto(chuidiang.agenda.modelo.Contacto);
   Code:
    0:	aload_0
    1:	getfield	#14; //Field textFieldId:Ljavax/swing/JTextField;
    4:	aload_1
    5:	invokevirtual	#37; //Method chuidiang/agenda/modelo/Contacto.getId:()I
    8:	invokestatic	#38; //Method java/lang/Integer.toString:(I)Ljava/lang/String;
    11:	invokevirtual	#39; //Method javax/swing/JTextField.setText:(Ljava/lang/String;)V
    14:	aload_0
    15:	getfield	#24; //Field textFieldNombre:Ljavax/swing/JTextField;
    18:	aload_1
    19:	invokevirtual	#40; //Method chuidiang/agenda/modelo/Contacto.getNombre:()Ljava/lang/String;
    ...
 

 Vemos el desglose de llamadas que se hacen en cada uno de los métodos de una forma un tanto especial.