Pegar o nome da variavel via Reflection  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
rodrigoallemand
GUJ Ranger
[Avatar]

Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline

Seguinte,

Como eu faço pra pegar o nome da variavel por reflection, por exemplo:



Como eu faço pra saber que o primeiro argumento desse método tem o nome "primeiroNome" e o segundo argumento é o "segundoNome"?
Sei que em uma versão dessas mais nova do Java (Java 6 se não me engano) já existe esta possibilidade...

E ai? Alguem sabe?
PS: Se não me engano o Louds ou o Thingol falou/falaram disso aqui uma vez mas eu não achei por nada...

This message was edited 2 times. Last update was at 02/04/2008 17:10:00


Rodrigo Allemand

A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br
[WWW] [MSN]
vanzella
JavaEvangelist
[Avatar]

Membro desde: 05/01/2007 18:45:15
Mensagens: 381
Localização: Cuiaba - MT
Offline

Vixi sera que tem como? da pra pegar o tipo do argumento, mas o nome não tenho ideia, me diz pra que tu precisa do nome da variavel?

Sun Certified Java Programmer 5.0
"Se você não esta confuso, não esta prestando atenção!"
rodrigoallemand
GUJ Ranger
[Avatar]

Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline

vanzella wrote:me diz pra que tu precisa do nome da variavel?

Bem, digamos que eu um determinado momento da minha chamada a um método via reflection, eu precise escolhe o atributo pelo nome...
Imagine que eu tenha, em um contexto qualquer, 3 strings em uma lista. No método de exemplo no inicio do Post, qual String vc iria passar para o método?!? Sacou?!?
Pra matar mais ainda a sua curiosodade, trata-se de um framework meio MVC, meio RESTful, pra atender a demanda de um cliente...

Rodrigo Allemand

A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br
[WWW] [MSN]
uchoaaa
JavaChild

Membro desde: 01/04/2006 21:02:33
Mensagens: 133
Offline

Bom, não entendi mto bem seu exemplo e nem sei se tem como fazer isso, hehe (até pq a máquina virtual guarda a referência na memória e não o nome da variável)..
Mas vc pode ter alguém que mapeia isso pra vc. O VRaptor, por exemplo, usa o nome do parâmetro do request pra isso: um campo no formulário de name "pessoa.nome" diz pro VRaptor chamar via reflection setNome() da classe Pessoa...
lcegatti
JavaGuru
[Avatar]

Membro desde: 29/01/2007 13:43:20
Mensagens: 218
Localização: São Paulo
Offline

Rodrigo tente fazer isto criando Annotation, por exemplo:
-Primeiro crie sua Annotation


-Segundo declare em cada parâmetro do seu método essa Annotation passando o nome de cada atributo nos valores, o exemplo mostra como ficaria seu método e um exemplo de como pegar os nomes utilizando Reflection com sua Annotation:



Neste código como resultado ele imprime:


Espero ter ajudado...

[]'s

SCJP
Caia na Real
[MSN]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

Poxa amigo, eu costumo usar Reflection e inclusive provavelmente foi pra mim que o Thingol respondeu o tal post que vc diz estar procurando e não ter achado por nada.

Mas o problema é que eu realmente não consegui entender o que vc quer... pode me explicar melhor?!

[]'s, Renata
[Email]
rodrigoallemand
GUJ Ranger
[Avatar]

Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline

É, acho que eu não to me expressando direto por mais que o exemplo seja simples... vamos para a vida real...
Imagine que vc irá programar agora uma classe "tipo Controller" para a sua aplicação e nela vc precisa criar o método processaLogin, conforme assinatura abaixo.

Agora, imagine que vc tem uma "bolsa de objetos", onde vc precisa pegar dois objetos do tipo String com esses nomes, para fazer a chamada do método processaLogin passando os argumentos corretos... sacou?
E não adianta usar anotações ou injetar no momento de criação da classe... eu preciso pegar o método, saber o nome dos argumentos que ele recebe e receber o retorno com o nome do argumento tb...

Rodrigo Allemand

A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br
[WWW] [MSN]
lcegatti
JavaGuru
[Avatar]

Membro desde: 29/01/2007 13:43:20
Mensagens: 218
Localização: São Paulo
Offline

Vc quer retornar o nome dos parâmetros do seu método, não é isso ?
Usando Annotation é uma solução prática, o exemplo não está injetado durante a criação da Classe, vc vai simplesmente declarar a Annotation em cada um dos parâmetros do seu método passando o nome deles, e vai recupera-las usando Reflection.

Ou realmente não estamos entendendo.

Acho que não tem como recuperar o nome do parâmetro utilizando apenas Reflection, com versões anteriores ao Java 6.

[]'s

SCJP
Caia na Real
[MSN]
luistiagos
GUJ Expert
[Avatar]

Membro desde: 10/07/2006 10:37:23
Mensagens: 3161
Offline

Cara não sei se tem como fazer isto que vc quer não... mas se não tiver uma outra solução é vc mapear a classe e o metodo e os argumentos exemplo:




da mais trabalho pro cara criar esses xmls o tempo todo que precisar desta funcionalidade mas é um quebra-galho neste sentido...




SCJP 1.5
SCJA 1.0
IBM DB2 Associate
[Email] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Hm, você pode também enviar os parâmetros na ordem esperada.

Ooou não usar parâmetros nos métodos. Cada Action tem um método "execute", e o controller apenas seta os parâmetros dessa classe.

Former LIPE.
[ICQ]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

Nenhum dos métodos de java.lang.reflect.Method trás o nome dos parâmetros.

De fato, a máquina virtual não conhece os nomes dos parâmetros, apenas os seus tipos. Os nomes dos parâmetros são perdidos durante a compilação, tanto que se você abrir o .class gerado em um editor de textos ou em editor hexadecimal, os nomes dos parâmetros não estarão lá!

Então, você vai ter que resolver de outra forma.

This message was edited 2 times. Last update was at 03/04/2008 10:54:22


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
rodrigoallemand
GUJ Ranger
[Avatar]

Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline

lcegatti wrote:Usando Annotation é uma solução prática, o exemplo não está injetado durante a criação da Classe, vc vai simplesmente declarar a Annotation em cada um dos parâmetros do seu método passando o nome deles, e vai recupera-las usando Reflection.

Vc entendeu perfeitamente... só que eu estava pensando em uma solução que deixa o desenvolvedor livre pra fazer isso.... ou não depender de nada meu, sacou? Eu não queria nem anotação, mas faz-se necessário...
Vou pensar um pouco mais nessa anotação...

luistiagos wrote:Cara não sei se tem como fazer isto que vc quer não... mas se não tiver uma outra solução é vc mapear a classe e o metodo e os argumentos exemplo:






da mais trabalho pro cara criar esses xmls o tempo todo que precisar desta funcionalidade mas é um quebra-galho neste sentido...

É... mas entre anotação e xml, fico a anotação...

LIPE wrote:Hm, você pode também enviar os parâmetros na ordem esperada.
Ooou não usar parâmetros nos métodos. Cada Action tem um método "execute", e o controller apenas seta os parâmetros dessa classe.

ID nos atributos?!? com isso eu usaria o Spring ou o próprio BeanUtils...

victorwss wrote:Nenhum dos métodos de java.lang.reflect.Method trás o nome dos parâmetros.

De fato, a máquina virtual não conhece os nomes dos parâmetros, apenas os seus tipos. Os nomes dos parâmetros são perdidos durante a compilação, tanto que se você abrir o .class gerado em um editor de textos ou em editor hexadecimal, os nomes dos parâmetros não estarão lá!

Então, você vai ter que resolver de outra forma.

Disso eu sei... mas eu me lembro que alguem aqui do forum comentou sobre em uma versão do Java (6 ou 7) iria existir esta possibilidade...

Rodrigo Allemand

A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br
[WWW] [MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

De fato:
- O que o VictorWSS tinha dito está certo;
- Os nomes dos parâmetros estão presentes nos arquivos .class se eles tiverem sido compilados com informação de debugging (isso porque eles são armazenados mais ou menos como se fossem variáveis locais, e como você deve saber, os nomes de variáveis locais são guardados apenas se a informação de debugging estiver presente no .class);
- Eles não são recuperáveis via reflection;
- Antes do lançamento do Java 6.0 o pessoal da Sun tinha prometido que essa informação iria ficar disponível via reflection, porque ela é importante para expor métodos de classes normais como web services. Só que isso aparentemente acabou não sendo feito. Não sei se existe uma maneira "torta" de fazer isso.
- Não sei se alguma versão mais recente do ASM ( http://asm.objectweb.org ) permite analisar um arquivo .class de forma que essa informação possa ser obtida. É questão de dar uma olhada.


[WWW]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

Nossa, agora eu acho que entedi a questão... vc quer pegar o nome dos parâmetros de um método que vc acessa por reflection, né?

Puxa,, realmente não sei como fazer isso... eu acho que o post q rolou no guj q vc fala é esse aqui http://www.guj.com.br/posts/list/77566.java

Foi uma questão minha, mas era pra pegar o nome de um componente, não de um parâmetro...

[]'s, Renata
[Email]
julioviegas
Debugger

Membro desde: 14/08/2008 07:50:52
Mensagens: 70
Offline

Sei q esse topico eh meio antigo, mesmo assim seguem meus .02 cents pois precisei disso ha pouco, e tive q correr atras...

Se sua classe foi compilada com os simbolos de debug, o .class possui internamente o q se chama de LocalVariableTable, acessivel somente(pelo menos por enquanto) por instrumentacao de codigo, via ASM, Javassist, etc...

Se vc precisar disso, olhe o utilitario LocalVariableTableParameterNameDiscoverer.getParameterNames do Spring. Cabe lembrar q eh necessario ler os javadocs dessa classe, pois existem dicas de otimizacao de uso dessa classe.

Att,
JV -- julioviegas.com
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team