Dúvida com reflection+taglib

6 respostas
P

Olá!

Pessoal,

Eu e um amigo estamos desenvolvendo uma taglib,
pensamos em fazer semelhante a “convenção” do struts,
onde passamos para a taglib o nome do objeto e por reflection ela invoca o metódo.

Exemplo:

Struts

<bean:write name="Classe" property="atributo"/>

Nossa tag

<t:arvore collection="Colecao" property="atributo"/>

No caso do Struts, ele vai procurar,
um metódo getter para o “atributo”, segundo a convenção Java,
portanto: Classe.getAtributo()

Fui fazer isso, mas por reflection a única maneira que achei,
foi pegar a primeira letra da property fazer um upper nela e concatenar:

[color=red]“get” + UPPER(a) + “tributo” [/color][color=green]/pseudo código/[/color]

É isso mesmo???

Grato,
Pablo

6 Respostas

maxguzenski

caram tenho 99% de certeza q essa é a maneira correta…
mas como o struts é openSource nao custa nada olhar o codigo deles ne ? :wink:

kuchma

phstc:
Fui fazer isso, mas por reflection a única maneira que achei,
foi pegar a primeira letra da property fazer um upper nela e concatenar:

[color=red]“get” + UPPER(a) + “tributo” [/color][color=green]/pseudo código/[/color]

Quando precisei fazer, fiz dessa forma tambem…

Lembre-se de que metodos que retorna booleanos podem ter o getter no formato “isAtributo”. Tendo isso em mente acabei mudando o esquema que estava fazendo na epoca… ao inves de passar o atributo e eu tentar pegar o getter, coloquei para ser passado diretamente o nome do metodo. Para o usuario nao muda muito e eh mais pratico, pois ele pode dar o nome que ele quiser para o metodo.

Se voce tem um ambiente controlado e pode garantir que nao ocorrerao conflitos de seguranca com o Security Manager, considere utilizar diretamente os atributos, sem passar pelo getter. Eh um negocio bacana que da pra fazer com reflection. :smiley:

Marcio Kuchma

P

maxguzenski:
caram tenho 99% de certeza q essa é a maneira correta…
mas como o struts é openSource nao custa nada olhar o codigo deles ne ? :wink:

Peguei os fontes do struts, não achei nada de concatenção, porém não entedi como eles, vou demais para mim :wink:

P

kuchma:
phstc:
Fui fazer isso, mas por reflection a única maneira que achei,
foi pegar a primeira letra da property fazer um upper nela e concatenar:

[color=red]“get” + UPPER(a) + “tributo” [/color][color=green]/pseudo código/[/color]

Quando precisei fazer, fiz dessa forma tambem…

Lembre-se de que metodos que retorna booleanos podem ter o getter no formato “isAtributo”. Tendo isso em mente acabei mudando o esquema que estava fazendo na epoca… ao inves de passar o atributo e eu tentar pegar o getter, coloquei para ser passado diretamente o nome do metodo. Para o usuario nao muda muito e eh mais pratico, pois ele pode dar o nome que ele quiser para o metodo.

Se voce tem um ambiente controlado e pode garantir que nao ocorrerao conflitos de seguranca com o Security Manager, considere utilizar diretamente os atributos, sem passar pelo getter. Eh um negocio bacana que da pra fazer com reflection. :smiley:

Marcio Kuchma

Nunca usei boolean com is, como ficaria? Sempre usei como qualquer getter e setter! Acho interessante passar pelo atributo, somente para manter o “padrão” adotado pelo struts!

Você diz usar atributos públicos???

[]'s,
Pablo

kuchma

Primeiro vamos com esta.

Nao… voce pode usar atributos privados e ler seus conteudos via reflection, desde que o Security Manager nao barre isso (por default ele nao faz isso).

Veja:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/AccessibleObject.html#isAccessible()
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible(boolean)

Por isso que eu disse que eh bacana. :smiley:

Eh, faz sentido. Principio da menor surpresa - ou algo assim.

Veja o isAccessible()/setAccessible(boolean) acima. :wink:

Marcio Kuchma

A

Kuchma.

VC c poderia me dar um exemplo de como utilizar esse isAccessible()/setAccessible(boolean) … Eu vi a api mas não consegui usar !! :ó(

Obrigado.

Criado 18 de novembro de 2004
Ultima resposta 21 de mar. de 2005
Respostas 6
Participantes 4