Descobrir imports realizados em minha classe, seria por reflection?

Olha preciso capturar de alguma maneira os imports realizados em minha classe e como ainda não encontrei algo com reflection que me providenciasse isto estou em busca de outra alternativa. Alguém tem uma boa idéia?

Me diz por que quer isso, para ver se eu entendo…

Você tem como descobrir as dependencias da tua classe via reflection, mas não quais foram os imports utilizados no código fonte. Para isso, você vai precisar ler os fontes.

Se quiser saber quais os imports você precisa abrir os bytecodes do arquivo .class; você pode usar um framework como o ASM ( http://asm.objectweb.org ) , mas mesmo assim não é exatamente perfeito. É que no .class aparecem as referências às classes efetivamente importadas, não às que aparecem no código-fonte.

Programa-fonte:

import java.util.*;
... 
List x = new ArrayList ();
System.out.println (3);

Arquivo .class:

java.util.List
java.util.ArrayList
java.lang.System
java.lang.String
java.lang.Integer
java.io.PrintStream

O motivo pelo qual estou interessado nos imports é o seguinte.

Estava eu passeando pelos tópicos do GUJ e vi um usuário pesaroso por seus projetos que ficavam enormes por conta dos jars inclusos, mas que os mesmos não eram usados em sua totalidade, ou seja, muita classe não chega nem a ser utilizada.

Então, eu pensei em desenvolver algo que extraisse dos jars apenas as classes utilizadas, lógico que considerando todas as dependências necessárias eliminando apenas as classes que não fossem de forma alguma ligadas ao meu projeto gerando um jar ‘magrelo’ apenas com as classes que realmente eram necessárias.

Então daí partiu minha dúvida, e como não encontrei nada sobre isso na documentação de reflection da Sun venho aos colegas averiguar as possibilidades de algum recurso existente.

Você pode criar um grafo das dependências, mas provavelmente ele não seria perfeito porque habitualmente sistemas em Java costumam usar reflection, ou seja, alguma coisa acabaria sendo omitida. Além disso, se você simplesmente considerar que alguma classe importa será usada eventualmente, você vai acabar é não desprezando nenhuma das classes dos JARs, e descobrir que na verdade você precisaria é de mais classes.

Uma forma meio imperfeita de você fazer isso é rodar seu programa com a opção -verbose:class várias vezes (cada vez tentando usar recursos diferentes de seu programa, para exercitar todas as classes necessárias) e capturar a saída em um arquivo. Por exemplo:

[Opened d:\jdk1.5.0_10\jre\lib\rt.jar]
[Opened d:\jdk1.5.0_10\jre\lib\jsse.jar]
[Opened d:\jdk1.5.0_10\jre\lib\jce.jar]
[Opened d:\jdk1.5.0_10\jre\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
...
[Loaded br.com.teste.Teste from file:/C:/java/Prototipo.jar]
...

Pegue essa saída, remova as classes desnecessárias (java., javax., com.sun.* etc) e veja quais são as classes, e de que JAR foram lidas.

Coisa de loco.
Se estivéssemos em 1970, onde os recursos de máquina eram escassos, eu até entenderia, mas em 2007, com processadores Dual Core, na casa dos gigahertz e gigas de RAM e disco, não entendo o porquê.

[quote=danieldestro]Coisa de loco.
Se estivéssemos em 1970, onde os recursos de máquina eram escassos, eu até entenderia, mas em 2007, com processadores Dual Core, na casa dos gigahertz e gigas de RAM e disco, não entendo o porquê.[/quote]

Arquivos pequenos podem ser interessantes. Especialmente se você quer disponibiliza-los para download na web, ou anexa-los por e-mail. Embora as máquinas sejam realmente poderosas, aqui no Brasil nem todo mundo tem uma banda fantástica de rede, ainda.

Mesmo assim eu ando baixando o JDeveloper com mais de 150 megas, o Hibernate com mais de 30Mb, Eclipse com mais de 100Mb, etc etc etc.

Isso lá é real… mas nós somos desenvolvedores fissurados por bons hardwares, softwares e redes poderosas. Ainda sim, eu ficaria muito feliz se esses aplicativos ocupassem menos espaço.

E se tivesse um softwarezinho que reduzisse isso sem esforço pessoal nenhum, não seria mal utiliza-lo, seria? :slight_smile:

Na verdade, com ou sem um software desse, eu também recorro ao mesmo argumento que você… hahhahahahaha. Mas algo automático que funcione não seria nada mal…