Listar os pacotes e as classes de um pacote

Vai aqui uma pergunta pros feras, pois coloquei essa no fórum do portal java e nunguém respondeu até agora.

Gostaria de saber alguma maneira de listar todos os pacotes existentes em java e também as classes de um pacote especifico. Usando reflect eu consegui listar os metodos, construtores e campos de uma classe, mas não consegui listar as classes de um pacote, muito menos os pacotes. Estou precisando mesmo tirar essa dúvida. aguardo respostas.

[quote=efren_lopes]Vai aqui uma pergunta pros feras, pois coloquei essa no fórum do portal java e nunguém respondeu até agora.

Gostaria de saber alguma maneira de listar todos os pacotes existentes em java e também as classes de um pacote especifico. Usando reflect eu consegui listar os metodos, construtores e campos de uma classe, mas não consegui listar as classes de um pacote, muito menos os pacotes. Estou precisando mesmo tirar essa dúvida. aguardo respostas.[/quote]

Não sei se entendi direito a sua pergunta, mas se você quer saber toda a especificação da API do Java segue o link:

http://java.sun.com/j2se/1.4.2/docs/api/index.html

Desculpe por não ter me expressado direito. O que eu gostaria de saber é se existe alguma maneira de eu, em tempo de execução, descobrir quais são os pacotes disponível no java e também como listar as classes dos pacotes. Sei que isso é possível, pois o editor eclipse, quando se pressiona “Ctrl + barra” exibe um list com todas as classes, ou seja ele leu aquilo de alguma maneira, e o que eu quero saber é que maneira é essa, se não for pedir demais.

Na maioria dos editores existe o “inteligesence” que mostra os pacotes e suas classes, mas infelizmente em tempo de execução do sistema não conhece .
Vou tentar descobrir
Se souber me avise

:oops:

[quote=efren_lopes]
Gostaria de saber alguma maneira de listar todos os pacotes existentes em java e também as classes de um pacote especifico. Usando reflect eu consegui listar os metodos, construtores e campos de uma classe, mas não consegui listar as classes de um pacote, muito menos os pacotes. Estou precisando mesmo tirar essa dúvida. aguardo respostas.[/quote]

Que coincidência, eu estava brincando de escrever um programa que fazia mais ou menos isso. É que queria listar as classes para gerar uma lista de palavras para o Ultraedit poder fazer “syntax coloring”.
Não há uma API em Java que faça isso “diretamente” para você, pelo seguinte motivo: como você deve saber, o Java tem um “ClassLoader”, não um “PackageLoader”. Ao carregar uma classe, o ClassLoader procura no classpath a classe desejada (digamos que seja org.xml.sax.AttributeList). Essa classe faz parte do pacote org.xml.sax, mas isso é por causa do nome dela, não porque ela esteja dentro de um .jar específico. No JDK 1.4.2 ela está em jre\lib\rt.jar (faz parte das classes-padrão do JDK).
Você pode listar rt.jar e descobrir que existem as seguintes classes cujo nome começa por org.xml.sax:
AttributeList
Attributes
ContentHandler
DTDHandler
DocumentHandler
EntityResolver
ErrorHandler
HandlerBase
InputSource
Locator
Parser
SAXException
SAXNotRecognizedException
SAXNotSupportedException
SAXParseException
XMLFilter
XMLReader
Nada impede de você escrever uma classe org.xml.sax.EfrenLopes e pô-la no classpath de seu programa - ela irá fazer parte do pacote e poder acessar legitimamente todos aqueles membros “package-private” que não podem ser acessados por classes normais.
Então o que você quer fazer exige na verdade:

  • Percorrer o seu CLASSPATH
  • Abrir todos os .JAR que existem no seu classpath, e procurar as classes;
  • Nos diretórios do seu classpath, procurar também arquivos .class.
    Isso quer dizer que a API teria de fazer muito trabalho, e por isso não foi implementada porque ela poderia levar um tempo muito grande para ser executada.
    Se você ler o código-fonte do Eclipse pode ser que você veja que ele faz exatamente isso… (Não cheguei a ler o fonte, mas deve ser algo parecido. E é por isso que o Eclipse requer que você especifique os .JAR na configuração do projeto.)
    Se você quer somente listar as classes-padrão do JDK você pode pegar o rt.jar, usar java.util.zip ou java.util.jar para obter os nomes dos arquivos .class dentro de rt.jar, e usar class.forName(nome_da_classe, false, null) para obter o objeto java.lang.Class para cada classe (obviamente você tem de pegar o nome da entrada no .jar, que é “java/lang/String.class”, e alterar para “java.lang.String”, removendo o sufixo .class e trocando / por .)
    Uma vez que você tem o objeto Class, você pode ver se a classe é pública (para que você quer uma classe privada do JDK? você não pode instanciá-la, nem referenciá-la, então você só quer as classes públicas), e outras coisas interessantes.
    Deve ter sido assim que o Patrick Chan gerou a parte de referência daquele livro imenso, o Java Almanac, ele deve ter feito um programa combinando isso e mais um “doclet”, e mais algumas coisas.
    Você pode repetir o processo para outras classes interessantes, tais como as de servlets (javax.servlet.http.*) que normalmente ficam em algum .jar como “servlet.jar”.