Verificando annotacoes de uma classe

4 respostas
jopss

Olá…

Estou brincando com Annotations e classes, e agora estou travado no seguinte caso:
Tenho uma anotação em uma classe, que indica uma outra classe (para ações)…
Agora, como eu faço o “ligamento” entre elas, tipo, como eu posso fazer para acessar dados/métodos da outra?

Tenho esta classe anotada:

@Action(path=CommunityActionTestActionCliente.class)
public class TestAnnotation {
...
}

E esta outra “normal”:

public class TestAction {

     public void ola(){
          System.out.println("olá");
     }
}

Agora eu queria que quando carregado a classe TestAnnotation, automaticamente acesse o método “ola” de TestAction.
Mas como fazer para saber as classes em execução, saber se ela implementa a anotacao, pegar a classe referenciada na anotação e fazer o acesso.
Tenho uma boa experiencia com Refletion… acessar methods, fields, etc eu faço de boa. Mas nao estou conseguindo fazer isto.

A ideia seria criar uma classe que pegasse o path de onde está os “.class”, verificar se implementa a anotacao, pegar a classe referenciada e acessar o método “ola”… mas, dessa forma, como eu faria para fazer tal verificação a toda carga da classe TestAnnotation ?? Ou melhor, como fazer pra acessar somente esta classe carregada “agora” e verificar a anotação?? Aspectos seria o ideal ??

Estou meio perdido… alguem tem ideia?

jopss

jopss

4 Respostas

T

Para você obter tal tipo de comportamento, você precisa carregar sua aplicação com um ClassLoader customizado que fizesse exatamente isso - e é por isso que não é tão fácil usar Annotations quanto parece.

jopss

Olá thingol. vlw pela dica…

Eu até consigo criar um ClassLoader customizado meu para fazer oq eu quero, mas, agora surgiu uma dúvida: o uso pelo cliente. Ou seja, quando uma classe tiver que ser carregada por este ClassLoader criado.

Eu faço assim, e funciona:

CommunityClassLoader loader = new CommunityClassLoader();

Window screen = (Window) loader.loadClass(TestScreen.class.getName()).newInstance();
screen.setVisible(true);

Isso abre a tela e, com o loader, verifica se existe uma anotação específica, fazendo algo entao…
O problema é que não se sabe qual classe irá implementar a annotacao, entao, todas as classes que eu quiser ser “pesquisada”, terei que fazer o loader na mão ?? Eu queria fazer somente isso e funcionasse:

TestScreen s = new TestScreen();
s.setVisible(true);

Tipo, de alguma forma, indicar ao java a minha loader e deixar ele se virar com o resto… :stuck_out_tongue:
Creio que seja possível, pois usamos diariamente diversos frameworks e suas anotacoes, e nao precisamos mexer com ClassLoader deles… usamos as classes normalmente…

Esta é a caracteristica que preciso, como faria ?? Pelo que pesquisei até agora, não ví como. Na documentação diz para fazer como da primeira forma… mas então como os frameworks funfam ?? :roll:

jopss

sergiotaborda

Faltam peças neste seu puzzle. Reflection serve para ler as anotações tb ( getAnnotations()).
Não precisa mexer com arquivos. (pelo menos não vejo vantagem)
Mas as anotações estão em uma terceira classe. É essa classe que tem que ser investigada.
Vc não precisa investigar a classe no classe loader se usar um façade ou lazy loading.
Ou seja, o seu framework executa a terceira classe , durante a execução ele investiga a classe , memoria isso e executa
da proxima vez ele já tem o modelo e apenas executa.

Com esse Testblablabl é meio complica entender o que está tentando fazer…

renatocustodio

Talvez o que ele está querendo fazer seja mais fácil com AOP, não?

Criado 26 de maio de 2008
Ultima resposta 27 de mai. de 2008
Respostas 4
Participantes 4