Java: processar o código fonte java, métodos de extração
quero analisar os ficheiros de código fonte java, e extrair o código fonte dos métodos.
Eu precisaria de um método como este./** Returns a map with key = method name ; value = method source code */
Map<String,String> getMethods(File javaFile);
Existe uma maneira simples de conseguir isto, uma biblioteca para me ajudar a construir o meu método, etc. ?
6 answers
Obtenha o processador java de http://javaparser.github.io/javaparser/
Vais ter de escrever um código. Este código irá invocar o analisador... vai devolver-te uma unidade de compilação: InputStream in = null;
CompilationUnit cu = null;
try
{
in = new SEDInputStream(filename);
cu = JavaParser.parse(in);
}
catch(ParseException x)
{
// handle parse exceptions here.
}
finally
{
in.close();
}
return cu;
Nota: O SEDInputStream é uma subclasse de fluxo de entrada. Você pode usar um FileInputStream se quiser.
Vais ter de criar uma visita. Seu visitante será fácil porque você só está interessado em métodos:
public class MethodVisitor extends VoidVisitorAdapter
{
public void visit(MethodDeclaration n, Object arg)
{
// extract method information here.
// put in to hashmap
}
}
Para invocar o visitante, Faça isto:
MethodVisitor visitor = new MethodVisitor();
visitor.visit(cu, null);
QDOX é um analisador mais leve, que apenas analisa até o nível do método, ou seja, o corpo do método não está sendo processado em declarações. Ele lhe dá mais ou menos, o que você pede, mesmo que o que você teria navegado o modelo para encontrar o nome certo, como ele não indexa classes e métodos pelo nome.
Acho que podes usar o gerador de analisador sintético ANTLR.
É muito fácil de usar e o site do ANTLR tem muitos exemplos escritos em Java.
Também vem com um plug-in para o eclipse.Podes construir o teu analisador com um dos geradores de analisadores:
Também pode usar (ou estudar como funciona) algo pronto. Existem Java Tree Builder que usa JavaCC e RefactorIt que usa o ANTLR.
Pode usar uma doclet personalizada com o JavaDoc?
Doclet.com pode fornecer mais informações.