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
