Verificar classes com anotações

Pessoal

Criei uma anotação e utilizei ela em diversas classes do meu projeto.

Como poderia em um determinado método, verificar todas as classes do meu projeto que possuem aquela anotação?

Tu vai ter que usar reflection! :wink:

Um tutorial do GUJ sobre replections:

http://www.guj.com.br/article.show.logic?id=10

Uma dica é essa:

Annotation[] anotacoesDaClasse = Object.class.getAnnotations();

Acho que a parte mais difícil é, obviamente, determinar quais são as classes do seu projeto. Isso é meio chato de saber; uma forma é você passar como parâmetro a lista de JARs do seu projeto, e ir examinando os arquivos .class de cada um desses JARs.

[quote=thingol]Acho que a parte mais difícil é, obviamente, determinar quais são as classes do seu projeto. Isso é meio chato de saber; uma forma é você passar como parâmetro a lista de JARs do seu projeto, e ir examinando os arquivos .class de cada um desses JARs.
[/quote]

Pois é. Minha dúvida maior é justamente descobrir quais são as classes do meu projeto.

Gostaria de fazer isto dinâmicamente, ou seja, não deixar fixo no código.

A única idéia que tive foi buscar em todos os diretórios e subdiretórios do meu projeto, por todos os arquivos .class, bem como, os .class encontrados dentro de .jars.

Mas não sei se esta é a melhor solução. Alguém tem alguma idéia ou dica melhor?

Realmente é a unica solução. Voce tem que andar de um em um e verificar.

Pois é… Acho que vou ter que fazer isto mesmo…

Outra dúvida é a seguinte:

Levando em conta que eu terei que ler todos os diretórios e arquivos .jar do meu projeto dinâmicamente, isto pode se tornar um processo demorado, caso hajam muitos diretórios e arquivos.

Gostaria de fazer esta operação apenas uma vez, por exemplo, na primeira vez que a aplicação for executada, ler todas as classes que contenham determinada anotação e armazenar em uma Collection, visivel por todos os servlets do projeto (algo como os init-parameters do ServletConfig, porém estes só podem ser definidos através do deployment descriptor e eu precisaria fazer isto em tempo de execução). Não gostaria de, a cada requisição de cada servlet, ter que fazer todo esse processo novamente. Também não gostaria de deixar este objeto na sessão, pois isto pode ocupar memória demais no servidor.

Alguém tem alguma idéia do que posso fazer?

Acho que quando você for empacotar sua aplicação você poderia, no seu script de empacotamento, chamar alguma coisa que gerasse essa lista de classes. Então você poria a lista de classes em um arquivo texto (por exemplo) que ficaria disponível para sua aplicação.

A vantagem é que você pode filtrar um pouco a tal lista na hora de gerar a lista, já que se você varrer TUDO você vai ver que há muito lixo e coisas que não lhe interessam. Outra vantagem é que você até pode conferir - na hora de gerar a aplicação - se a tal anotação foi posta na classe, eliminando até o tempo de runtime para checar se a tal anotação está presente. Então você pode gerar uma lista só com as classes anotadas.

Na verdade, saber se uma determinada classe tem uma determinada anotação é tarefa para uma outra classe (um ClassLoader) que for carregar a tal classe, talvez para modificar-lhe o comportamento. Não sei se seu servidor de aplicações tem alguma coisa que permita você modificar o comportamento do ClassLoader (como se fosse, por exemplo, o AspectJ).