Procurar por classe anotada no classpath

Olá Pessoal;

Preciso percorrer o classpath de minha aplicação em busca de classes com uma determinada anotação. Alguem tem ideia de como posso fazer isso?

Um tempo atras eu precisei e fiz um. Talvez tu encontre algo hj no google pronto, não?

Bom, a ideia é a seguinte.
Consule o teu ClassLoader (aqui tu pode ter problemas se mudar o classLoader), se for
o URLClassLoader tem uma chamada que retorna todos os caminhos do classpath.

urlLoader.getURLs();

Isso te retorna um monte de URL. Pode ser Jar ou diretório. Se for diretório
então é só pegar os .class de dentro (usando a api java.io), usar o ClassLoader para pegar o Class<?> (aqui
vai ter que montar o nome da classe a partir do caminho dos diretórios dele).

Com o Class<?> então tu verifica se tem a annotations ou não.

Agora se for .jar, tu passa a localização para o
java.util.jar.JarFile
E vai passeando pelo conteúdo atras de .classs. Se achar então segue a mesma ideia
de cima, ou seja, monta o nome, passa para o ClassLoader e pega o Class<?>

Só toma cuidado que isso pode demorar. Implementei uma especie de filtro de pacotes e então direcionava
a procura apenas em diretórios e pacotes do meu interesse. Por exemplo, apenas para
com.empresa.sistema
Todo o resto, ele ignora e não entra.

opa, valeu a ajuda. estamos chegando perto.

Para obter esse urlLoader eu tentei:

URLClassLoader loader = (URLClassLoader) URLClassLoader.getSystemClassLoader(); for (URL url : loader.getURLs()) { System.out.println(&quot;-&gt;&quot;+url.getPath()); }

mas ele só retorna para mim:

/C:/Program%20Files/Java/jdk1.5.0_17/lib/tools.jar
/C:/apache-tomcat-6.0.18/bin/bootstrap.jar

eu precisaria investigar todo o classpath da aplicação

Mas esse não é todo o teu classpath?

não. tenho uma série de outras pastas como classpath. estou usando tomcat, entao tenho a pasta lib do tomcat, WEB-INF/lib e WEB-INF/classes da aplicação web, etc.

Tenta chamar então

URLClassLoader loader = (URLClassLoader) Thread.currentThread().getContextClassLoader();

Opa, era isso ai mesmo.

Valeu demais cara.