[Resolvido] Descobrindo quem usa determinadas anotações

5 respostas
paulog

Olá senhores,

Estou com o seguinte problema:

Tenho uma classe qualquer :

@Componente("XPTO")
public class UmComponente {
   ...
}

E outra(s) que definiria(m) uma “operação” para esse componente:

@Operacao(componente="XPTO")
public class OperacaoSomar [
   ...
}

Então, tendo esse exemplo, como eu poderia descobrir todas as operações de um determinado componente?

5 Respostas

victorwss
public Componente descobreSeTemAnotacao(Class<?> classe) {
    Componente c = classe.getAnnotation(Componente.class);
    System.out.println(c == null ? "não tem anotação" : "O valor é " + c.value());
}


public Operacao descobreSeTemAnotacaoTambem(Class<?> classe) {
    Operacao c = classe.getAnnotation(Operacao.class);
    System.out.println(c == null ? "não tem anotação" : "O valor é " + c.componente());
}
paulog

Olá Victor,

Bem acho não expliquei exatamente o que eu buscava. :slight_smile:

Hum… seria algo assim:
Tendo o meu classpath, como saber quais são todas as classes que implementam uma operação?
Iterando por cada classe e perguntado se ela é uma operação?
Mas, imagino eu, que exista o problema que nem todas as classes tenham sido carregada ainda. (E a demora de iterar sobre todo o classpath só da minha aplicação)

Uma outra solução seria determinar quais são os componentes e suas operações no deploy, pegando as classes compiladas e verificando se elas tem as anotações e gerando um xml “automaticamente” com esses dados…
A aplicação roda e somente precisa ler o xml para descobrir as operações de um componente.
A dificuldade, é que isso pode tornar o deploy um tanto quanto lento.

Alguma outra solução? Algo como determinar que as operações fiquem no pacote nomedocomponente.operacao?
Help?

Rafael_Nunes

Já tentou carregar essas classes por reflection para fazer essa varredura da anotação(ah não ser que essa annotation não vá pro bytecode)?

victorwss

paulog:
Olá Victor,

Bem acho não expliquei exatamente o que eu buscava. :slight_smile:

Hum… seria algo assim:
Tendo o meu classpath, como saber quais são todas as classes que implementam uma operação?
Iterando por cada classe e perguntado se ela é uma operação?
Mas, imagino eu, que exista o problema que nem todas as classes tenham sido carregada ainda. (E a demora de iterar sobre todo o classpath só da minha aplicação)

Uma outra solução seria determinar quais são os componentes e suas operações no deploy, pegando as classes compiladas e verificando se elas tem as anotações e gerando um xml “automaticamente” com esses dados…
A aplicação roda e somente precisa ler o xml para descobrir as operações de um componente.
A dificuldade, é que isso pode tornar o deploy um tanto quanto lento.

Alguma outra solução? Algo como determinar que as operações fiquem no pacote nomedocomponente.operacao?
Help?

Cara, já fiz algo parecido uma vez. Cria um ClassLoader que abre um arquivo jar como se fosse um zip, e lá dentro identifica quais arquivos terminam com “.class”. Daí carrega cada um destes .class e então usa reflection para determinar quais classes são importantes.

paulog

Beleza.

Isso mesmo que eu queria. (Imaginava que seria algo assim).

Brigadão.

Criado 2 de julho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 5
Participantes 3