| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 14:43:55
|
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:12:00
|
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".
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:22:56
|
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):
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:31:06
|
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:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:36:22
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:38:54
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:43:48
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:47:32
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 15:55:26
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 16:01:27
|
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:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 16:11:56
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 16:51:51
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Postei um bug na Sun...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/08/2008 18:38:21
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
thingol wrote:
Hahahahah, mais uma pro:
|
|
|
 |
|
|