Como ler classes em tempo de Runtime que contém uma determinada annotation

Alguém sabe como faço para ler as classes de um projeto em tempo de execução que contenha uma annotaion qualquer

Similar ao que o JPA faz, ele le todas as classes que tem o @Entity

Eu criei uma anotação e gostaria invocar um método que retornasse quais classes possuem essa annotation

Alguém saber como fzer, procurei várias coisas, mas ainda não consegui fazer nada

Lembre-se de que você precisa mapear as classes pro JPA (ou , em outras palavras, você precisa dizer onde estão as classes que ele precisa ler). Da mesma maneira, você vai precisar mapear estas classes em algum lugar. Daqui a pouco, posto código pra verificar se determinada annotation está presente na classe.

[]´s

Código:

Class c = Object.class; //Substitua object pela sua classe		
		java.lang.annotation.Annotation a = c.getAnnotation(Object.class); //Substitua object pela sua anotação;
		return a != null;

Este código retorna true se a classe contém a anotação (na própria classe, não em métodos, campos, etc.), false caso contrário.

[]´s

[quote=meneghette]Alguém sabe como faço para ler as classes de um projeto em tempo de execução que contenha uma annotaion qualquer

Similar ao que o JPA faz, ele le todas as classes que tem o @Entity

Eu criei uma anotação e gostaria invocar um método que retornasse quais classes possuem essa annotation

Alguém saber como fzer, procurei várias coisas, mas ainda não consegui fazer nada[/quote]

Pesquise sobre Reflection, com reflection você consegue fazer esse tipo de verificacão que você quer.
Veja também como criar suas próprias anotações.

Existe bastante material sobre os dois temas na internet e aqui no proprio GUJ.

Olá Pessoal, Obrigado pelas respostas,

Só falta uma coisa que ainda não estou conseguindo, (ps. é um projeto war), queria saber como poderia descobrir quais são as minhas classes do meu projeto.

O Como verificar já ta beleza sem possui uma annotation

Porém como o JPA se não definir nada no persistence ele procura automaticmaente pelas classes que tem @Entity, é ago similar, porém como fazer para ler em todos os pacotes as classes que possuo ?

Não tenho certeza se tem como (estou procurando por essa resposta há tempos). As maneiras que me ocorrem são:

  1. Usando instrumentação
  2. Lendo as classes físicas, ou seja, como arquivos (e usando estes caminhos pra descobrir os caminhos reais das classes, carregando-as, e lendo as anotações).
  3. Usando o Annotation Processor Tool (APT).

[]´s

Alguma maneira de ter deve ter, pois JPA e o SEAM faz a leitura

Obrigado

Que tem, não tenho dúvida. Inclusive, lembro que o thingol me falou , uma vez, q a JPA fazia isso através de instrumentação (método 1). Porém, não ví como fazer. Logo… escolha uma das alternativas que te passei e tente (a mais fácil é a segunda).

[]´s

Mas tem uma coisa… nao existe um arquivo de configuração do JPA assim como no Hibernate?
Desse modo ele sabe quais classes voce quer procurar.

[quote=Mark_Ameba]Mas tem uma coisa… nao existe um arquivo de configuração do JPA assim como no Hibernate?
Desse modo ele sabe quais classes voce quer procurar.[/quote]

Não, de fato existe um jeito de não precisar dizer nada, ele simplesmente “acha” as classes que tem @Entity. Segundo o thingol, isso é feito por instrumentação…

Lembro de um outro exemplo, também (não está muito claro na minha mente, já faz tempo que ví) em que um container EJB (não lembro qual) varria as classes contidas em determinado classpath buscando o que expor… Se não me engano, ví no Java Persistence with Hibernate (o livrão verde do Gavin King).

[]´s

[quote=meneghette]Alguém sabe como faço para ler as classes de um projeto em tempo de execução que contenha uma annotaion qualquer

Similar ao que o JPA faz, ele le todas as classes que tem o @Entity

Eu criei uma anotação e gostaria invocar um método que retornasse quais classes possuem essa annotation

Alguém saber como fzer, procurei várias coisas, mas ainda não consegui fazer nada[/quote]

Esse problema não é trivial.
Em primeira aproximação vc faz um Class.forName() pega o objeto Class e procura pela anotação usando os métodos de Class (isAnnotationPresent())
Essa parte é facil , mas cuidado , vc está carregando a classe. Isso pode ter efeitos secundários indesejáveis.

O seu problema é agora como encontrar os nomes da classes.
Uma primeira abordagem é fazer o programador especificar quais classes ele quer que sejam investigadas. Isso elimina o problema de ter que as encontrar. O outro jeito é deixar o porgramador dizer qual pacote deve ser scnaeado. Para scanear as classes em si vc usa algo como isto ou isto.

Já olhou o tópico http://www.guj.com.br/posts/list/149736.java?