Esta dica foi enviada pelo Constantino Jos� Rocha Cronemberger.
Voc� tamb�m pode contribuir enviando sua dica para 
[EMAIL PROTECTED]


javap - O class file disassembler do JDK

Uma ferramenta que muitas vezes passa despercebida e que por outro lado 
pode se mostrar muito �til � o javap, um "class file disassembler".
A documenta��o sobre esta ferramenta est� em 
http://java.sun.com/j2se/1.4/docs/tooldocs/windows/javap.html .

Apesar de ser bastante poderosa, a ferramenta apresenta duas 
caracter�sticas que algumas vezes podem se mostrar inconvenientes.
A primeira � que � necess�rio especificar o CLASSPATH. Se a aplica��o 
for pequena isso pode ser bem f�cil, eu concordo, mas quem aqui nunca 
teve problemas para identificar em qual dos JARs de um servidor de 
aplica��es se encontra aquela bendita classe? Ou ent�o pode ser que 
algumas das classes que seriam necess�rias no CLASSPATH n�o estejam 
dispon�veis.
A segunda � que as informa��es mostradas por essa ferramenta algumas 
vezes pode nos levar a conclus�es erradas quando se usa a op��o "-c" que 
serve para fazer a decodifica��o do c�digo. Veja o exemplo a seguir.
Suponha que voc� tenha duas classes Teste e Main

public class Teste {
   public static String metodo()  { 
      System.out.println("alo mundo");
      return null;
   }
}

public class Main  {
    public static void main(String args[]) {
        Teste.metodo();
   }
}

Compilando-as obtemos Teste.class e Main.class.
Rodando o javap na classe Main obtemos a seguinte sa�da:

Compiled from Main.java
public class Main extends java.lang.Object {
  public static void main(java.lang.String[]);
  public Main();
}
Method void main(java.lang.String[])
 0 nop
 1 invokestatic #13 <Method java.lang.String metodo()>
 4 pop
 5 return
Method Main()
 0 nop
 1 aload_0
 2 invokespecial #21 <Method java.lang.Object()>
 5 return

Preste aten��o na primeira linha do m�todo main (invokestatic), dela 
podemos concluir que o tipo de retorno para o m�todo "metodo" � String.
Vamos agora alterar a classe Teste e fazer com que o m�todo "metodo" 
retorne Object e n�o String. Em seguida compilamos SOMENTE esta classe, 
e rodamos novamente o javap com a classe Main:

Compiled from Main.java
public class Main extends java.lang.Object {
  public static void main(java.lang.String[]);
  public Main();
}
Method void main(java.lang.String[])
 0 nop
 1 invokestatic #13 <Method java.lang.Object metodo()>
 4 pop
 5 return
Method Main()
 0 nop
 1 aload_0
 2 invokespecial #21 <Method java.lang.Object()>
 5 return

Perceba que agora aquele m�todo parece estar retornando um Object, s� 
que como a classe Main n�o foi recompilada na verdade ela ainda est� 
esperando uma String, mesmo que o retorno de tal chamada esteja sendo 
ignorado. Comprove isso tentando executar a classe Main:
java -cp . Main
a sa�da � a seguinte:
Exception in thread "main" java.lang.NoSuchMethodError: 
Teste.metodo()Ljava/lang/String;
      at Main.main(Main.java:6)

O fato � que, como constatamos pela exce��o acima, a informa��o de qual 
o tipo de retorno esperado para cada chamada que � feita por uma classe 
� guardada em algum lugar no seu arquivo compilado (.class) e que o 
javap n�o apresenta essa informa��o, usando em seu lugar uma informa��o 
obtida em outra classe que por sua vez pode estar desatualizada.
Existem v�rias outras ferramentas bem similares ao javap, como por 
exemplo o Jasper (http://www.angelfire.com/tx4/cus/jasper/), e que n�o 
apresentam tais inconvenientes.
Agora, se voc� � maluco o bastante, voc� pode dar uma olhada na 
especifica��o da Java Virtual Machine no 4� cap�tulo 
(http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html) 
e obter ent�o algumas informa��es sobre o formato de um arquivo .class. 
Pode-se com isso fazer uma rotina que obtenha, por exemplo, a 
super-classe de uma classe sem a necessidade de carreg�-la atrav�s de um 
ClassLoader.

Constantino Jos� Rocha Cronemberger
Engenheiro de Computa��o pela Unicamp
[EMAIL PROTECTED]


Bons c�digos!!!

______________________________________________________________________________________________
 

Handerson Ferreira Gomes
Summa Technologies
Boletim Dicas Java - Sua dose di�ria de Java.



================================================================
Dicas-Java circula diariamente com pequenas dicas
sobre a plataforma Java e � mantido pela Sociedade de
Usu�rios Java - SOUJAVA (http://www.soujava.org.br)
- Quer contribuir com uma dica sobre Java? Envie um
e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discuss�o sobre a linguagem Java.
Saiba mais em http://www.soujava.org.br/lista.htm
------------------------------------------------------------------
- Para assinar este boletim envie um e-mail para [EMAIL PROTECTED]
- Para cancelar sua assinatura envie um e-mail para 
[EMAIL PROTECTED]
- O hist�rico das Dicas-List pode ser encontrado em 
http://www.mail-archive.com/dicas-list%40soujava.org.br




Responder a