API para obter assinatura de métodos e dados de classes

13 respostas
dyego.mota

Olá Pessoal,
preciso encontrar uma API que me dê a assinatura do método (consequentemente o tipo e parâmetros do mesmo), bem como as classes do projeto e seus atributos.
Alguém sabe me indicar alguma?
Utilizo o eclipse e os projetos são em java.
Estou fuçando no google a dias e não encontro a maldita!

Obrigado.

13 Respostas

drsmachado

Existe algo chamado reflection.
Por que não estuda isto?

P

No próprio java desde a versão 1.5 existe o recurso “Reflection” e isso vai resolver tudo isso que vc precisa.

dyego.mota

Então, pelo que sei Reflection é uma maneira de se descobrir dados de uma classe/objeto/interface em tempo de execução, certo?
No meu caso é uma análise estática, ou seja, não executar o projeto, apenas analisa-lo.
ex:
Vou carregar um projeto que nunca vi na vida e preciso obter informações sobre as classes e métodos do mesmo.
Em um programa simples é trivial, mas em um programa robusto gera um trabalho considerável, além disso vou utilizar esta informação para trabalhar em um plugin para o eclipse.

mesmo neste caso o “Reflection” resolve?

obrigado

drsmachado

Vá à API e veja :slight_smile:

dyego.mota

Pessoal,
Encontrei o que preciso! Caso alguém tenha a mesma dúvida:
http://publib.boulder.ibm.com/infocenter/rsmhelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/package-summary.html
http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FFieldDeclaration.html
http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcore%2Fresources%2Fpackage-summary.html

d34d_d3v1l

dyego.mota:
Pessoal,
Encontrei o que preciso!

Boa cara!!

PS: Se vc tivesse colocado “resolvido” no tópico eu não teria entrado aqui atoa. :slight_smile:
Já que estou aqui, Mirror da Caelum

Abraços,
sucesso

E

Se você precisa criar uma rotina que determina a árvore de chamadas de uma classe Java (“call tree”), é necessário usar uma biblioteca como o ASM ( http://asm.ow2.org/ ).

Por exemplo, no seguinte programa:

class Teste {
    public static void main(String[] args) {
        System.out.println ("Hello, world!");
    }
}

você gostaria de ter a seguinte árvore de chamadas (ou seja, saber que método de cada classe chama que métodos de outras classes, ou da mesma classe):

Teste#main -> PrintWriter#println

Através da biblioteca ASM é possível examinar o arquivo .class e verificar que é possível extrair essa informação.

josemanzoli

Você pode criar um parse da linguagem java e navegar pelas classes utilizando os nodes de navegação.

http://javacc.java.net/

dyego.mota

Valeu pessoal, obrigado pelas dicas adicionais, agora sim estou no caminho certo, hehe.

d34d_d3v1l:
Boa cara!!

PS: Se vc tivesse colocado “resolvido” no tópico eu não teria entrado aqui atoa.

d34d_d3v1l, gostaria de fazer isso, mas não sei como, se puderem indicar como colocar o resolvido no tópico…

Abraço.

dyego.mota

Olá pessoal, fim de férias cá estou pelejando com a obtenção destes dados…
Pelo que entendi até agora, a classe FieldDeclaration (http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FFieldDeclaration.html) deve fornecer as informações que preciso, mas ainda não conseguir fazer a coisa funcionar :frowning:

no link, a descrição do método fragments() é:
“public List fragments()
Returns the live list of variable declaration fragments in this field declaration. Adding and removing nodes from this list affects this node dynamically. All nodes in this list must be VariableDeclarationFragments; attempts to add any other type of node will trigger an exception.
Returns:
the live list of variable declaration fragments in this statement (element type: VariableDeclarationFragment)”

não compreendi o que é este “in this field declaration”(não a tradução, mas o significado).
pelo que compreendi este método retorna uma lista de variáveis, é isso? para capturar e manipular esta informação eu preciso criar um objeto do tipo List?

Já o método propertyDescriptors possui a seguinte descrição:
" public static List propertyDescriptors(int apiLevel)
Returns a list of structural property descriptors for this node type. Clients must not modify the result.
Parameters:
apiLevel - the API level; one of the AST.JLS* constants
Returns:
a list of property descriptors (element type: StructuralPropertyDescriptor)"

O que o “node type” significa? e este API level(aparentemente está relacionado com AST.JLS, que não sei exatamente o que é)?
qualquer informação adicional é bem vinda.

sergiotaborda

dyego.mota:
Olá pessoal, fim de férias cá estou pelejando com a obtenção destes dados…

Acho que o pessoal não entendeu que Reflection não resolve o seu problema. Dê uma olhada aqui , mas não sei se resolve.
Vc não tem acesso aos fontes , só aos .class ? E qual é o seu objetivo com isto ?

A API de Reflection é parte integrante do java desde o inicio (e não apenas do java 1.5), mas ela requer uma JVM correndo. Muitas ferramentas precisa dar parse do código para AST sem rodar a classe em si. O FindBugs é um que faz isto, talvez dando uma lida no codigo deles dê para entender como eles fazem.

ViniGodoy

Correção: A API de Reflection existe desde o java 1.0.
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html (veja o since)

O que surgiu no 1.5 foram os enums e os generics.

dyego.mota

sergiotaborda, obrigado por responder, tenho o código completo do projeto, entretanto, meu objetivo é criar um plugin para analiza-lo e exibir informações por meio de visualização de software, comparando versões do mesmo, etc.

encontrei um outro tópico descrevendo um problema relacionado ao que tenho aqui: http://www.guj.com.br/java/265123-problemas-com-ast-abstract-syntax-tree
Encontrei também um site da IBM descrevendo um exemplo de uso que pode me ajudar: http://www.ibm.com/developerworks/opensource/library/os-ast/

No momento estou estudando esse link da IBM, qualquer novidade posto aqui.
Ajudas continuam sendo bem vindas :slight_smile:

Criado 13 de dezembro de 2012
Ultima resposta 28 de jan. de 2013
Respostas 13
Participantes 8