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 ?
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.
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).
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.
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.