Listar os pacotes e as classes de um pacote

4 respostas
E

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.

4 Respostas

RRaminelli

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.

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

E

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.

RRaminelli

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:

T

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.

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”.
Criado 11 de novembro de 2004
Ultima resposta 11 de nov. de 2004
Respostas 4
Participantes 3