Lendo Classe em Java

Bom, preciso criar um algoritmo que dado um determinado arquivo (em Java), preciso identificar os métodos e atributos de cada método em cada classe e mostrar ao usuário, ou seja, dizer a ele quantos métodos existem, quais são, e quais os atributos de cada método.

Qual a melhor forma de fazer isso ? criando um analisador léxico ? Ou da para fazer na “unha” mesmo apenas fazendo testes para ver se estamos lendo um método ?

Use a API de Reflection do Java. Com ela você consegue tudo isso.

Edit:
Em uma rápida busca achei este link: http://javaes.wordpress.com/2012/10/14/reflexao-java/.
Você encontrará fácil como usar esta API. No GUJ mesmo têm alguns tópicos.

Obrigado. Isso resolve meu problema.

Já ia perguntar se leu o post que mandei! rsrs
Imagino que a partir dele implemente o seu caso tbm.

Sim, me antecipei na resposta. Muito útil o post que você me mandou, mas uma vez obrigado.

Apenas cuidado porque a reflexão não irá te ajudar se tiver que analisar um arquivo .java (que me pareceu ser esta a sua necessidade). De posse do arquivo .java, você deverá compilá-lo e carregá-lo no programa para usar a reflexão.

É essa mesma minha situação Ataxexe. Pelo jeito após pegar o arquivo tenho que carregá-lo. Através de um ClassLoader talvez ?

Mas temos aqui um problema: Vou receber apenas 1 classe qualquer, de uma outra aplicação que não tem nada haver com a minha. Vou ter que extrair os métodos dessa classe, mas pra isso preciso compilar e depois usar o reflection.

Aqui vem a questão: Seu eu compilar essa classe POSSÍVELMENTE irá dar erro, pois não terei os pacotes dependentes, e não quero que isso ocorra.

Então você terá que abrir mão da reflexão. De repente umas expressões regulares resolvem seu problema (provavelmente você terá que ignorar as quebras de linha para não ter muitas dores de cabeça).

É neste caso a Reflection não deve funcionar mesmo.

Mas tem uma solução: Pedir para o usuário já colocar a classe java compilada (.class), dessa forma eu posso carregar a classe com um ClassLoader e depois usar reflexão. Certo ?

Acho difícil que o “cliente” envie para ti apenas o .java, provavelmente isso virá empacotado em um .jar e, assim sendo, há grandes possibilidades de você receber .class. Neste paradigma, usar reflection é tranquilo.

ok. Obrigado.

Mais ou menos. Se ele mandar a classe compilada, mas alguma coisa na estrutura dela usar outra classe que não esteja no seu classpath, você terá um belo erro no carregamento. Se você receber um jar com tudo compilado (igual ao dsrmachado disse) vai te poupar um trabalhão.

É mais ou menos por isso que IDEs podem travar algumas funcionalidades quando seu código não compila.