Parâmetro anotado  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Tem como fazer o parâmetro de um método ser de uma classe qualquer, mas que possua uma determinada anotação? Algo do tipo:

This message was edited 1 time. Last update was at 16/08/2008 14:45:55

thingol
Moderador

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

Hum... você quer ver se, em tempo de execução, você recebeu um parâmetro anotado?

Você pode anotar parâmetros (veja http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/ElementType.html ), mas normalmente o que ocorre é que você analisa a classe à qual pertence o tal método que contém uma anotação no parâmetro, e você vê se está do jeito que você quer. Por exemplo, você poderia ter algo como:

E quando você pegar um objeto de uma classe que implementa Gambiarrable (por exemplo), pode ver se o tal primeiro parâmetro do método tem uma anotação "ReallyPog".

[WWW]
thingol
Moderador

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

Acho que não dá para anotar uma chamada de método, como isto aqui (continuando meu exemplo):




[WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Thingol, desculpe mas de cara não consegui entender.

Não importaria a classe do parâmetro, a única coisa que importaria seria que a mesma tivesse uma anotação específica. Me parece uma informação disponível em compile time:

thingol
Moderador

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

Dei uma acertada no meu exemplo, e realmente constatei que não posso incluir uma annotation em uma chamada de método.

[WWW]
thingol
Moderador

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

Hum, agora entendi o que você quer. Você gostaria que o compilador checasse se determinado parâmetro foi anotado; se não tiver sido, então você gostaria de um erro de compilação.

Talvez você precise de um "Annotation Processor" (procure por apt na documentação do JDK.) Um "annotation processor" é uma forma de você modificar o comportamento do compilador para que ele, por exemplo, possa checar tais anotações.
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

renato3110 wrote:Tem como fazer o parâmetro de um método ser de uma classe qualquer, mas que possua uma determinada anotação? Algo do tipo:




Não. Mas pode fazer isto :



Depois vc pode usar o processador de anotações ou vc pode criar um proxy.
O proxy pode facilmente - via reflection - testar, em runtime se o objeto passado tem a sua classe anotada com a anotação esperada.

This message was edited 1 time. Last update was at 16/08/2008 15:44:05


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

thingol wrote:Hum, agora entendi o que você quer. Você gostaria que o compilador checasse se determinado parâmetro foi anotado; se não tiver sido, então você gostaria de um erro de compilação.

Talvez você precise de um "Annotation Processor" (procure por apt na documentação do JDK.) Um "annotation processor" é uma forma de você modificar o comportamento do compilador para que ele, por exemplo, possa checar tais anotações.


Não o parâmetro, mas o tipo da variável.

Sei lá, acho engraçado ter tanta gambiarra e não ter isso. Acho até que seria simples, tipo:



Ou seja, você estaria dizendo que o tipo do parâmetro é uma subclasse de Object que possua a anotação @AnotacaoX (Object em si não tem é claro), o que pode ser verificado em tempo de compilação.

This message was edited 2 times. Last update was at 16/08/2008 15:51:39

renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

sergiotaborda wrote:Não. Mas pode fazer isto :



Depois vc pode usar o processador de anotações ou vc pode criar um proxy.
O proxy pode facilmente - via reflection - testar, em runtime se o objeto passado tem a sua classe anotada com a anotação esperada.


Eu quero justamente fugir da verificação em runtime. Como funciona o processador de anotações?
thingol
Moderador

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

Uh, mas tem um pequeno problema aí.

Você está afirmando que gostaria que o parâmetro, em vez de pertencer a uma classe que deva IMPLEMENTAR uma determinada interface (ou uma interface que deva estender uma determinada interface), deva pertencer a uma classe ou interface e a classe ou interface é que deve estar anotada com determinada anotação.

Ou seja, o que se pode fazer é algo como:
[WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Sim thingol, mas isso aí é em runtime, btw eu uso Class.isAnnotationPresent...

This message was edited 1 time. Last update was at 16/08/2008 16:12:11

renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Postei um bug na Sun...
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

thingol wrote:


Hahahahah, mais uma pro:

 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team