Obter lista de classes da aplicação [RESOLVIDO]  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
barenko
JavaBaby
[Avatar]

Membro desde: 07/04/2008 21:09:30
Mensagens: 81
Offline

Olá pessoal, cá estou com outra dúvida complicada...

é o seguinte:

Fiz um framework baseado em anotações, a idéia é o programador apenas utilizar o jar do framework, anotar as classes dele com minhas anotações e tudo funcionar como mágica.

Rodando pelo eclipse, funcionava muito bem nos casos de teste. Mas quando eu criava o pacote jar, ocorria erros diversos de null pointer.

Estudando mais o processo, eu vi que a implementação estava funcionando porque obtinha os .class da estrutura de diretórios da pasta bin, mas quando empacoto, a estrutura fica interna no jar. Blz, é só eu ler o conteúdo do jar e tudo volta a funcionar.

Só que tem um problema a mais: as classes anotadas da aplicação não ficarão no meu jar, ou seja: não conseguirei encontrá-las sem mapear as classes em algum arquivo de configuração(o q eu acho bem ruim).

Não conheço classloader, mas pelo q eu vi, ele só armazena as classes carregadas naquele momento, então não há garantias que todas as classes da aplicação estejam listadas.

Há alguma forma de obter todas as classes da aplicação? (tudo o q o sandbox daquela aplicação puder ver, eu tb gostaria de ver).

Alguém tem alguma idéia sobre isso?

This message was edited 2 times. Last update was at 20/01/2010 11:27:34

[Email]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

barenko wrote:O
Há alguma forma de obter todas as classes da aplicação? (tudo o q o sandbox daquela aplicação puder ver, eu tb gostaria de ver).


Não existe uma forma direta, mas existe forma sim.
A forma mais simples, usada por todos os frameworks que usam esse tipo de feature é deixar o programador definir o(s) pacote(s) onde estão as classes que devem ser analizadas. Dê uma olhada no método getPackageClasses doMiddleHeaven

Em tese vc pode iterar nos pacotes e sub pacotes mas isso é complexo a menos que vc tenha um sistema de arquivos virtuais incluso na sua API

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
plic_ploc
JavaChild

Membro desde: 11/06/2006 18:55:12
Mensagens: 137
Localização: Ibitinga - SP
Offline

Segue um exemplo de como você pode fazer:





Como usar:


Para obter as classes use:

This message was edited 1 time. Last update was at 19/01/2010 14:14:57


Java MVC - Brutos framework
Faça o download de um WebChat feito usando o Brutos MVC
barenko
JavaBaby
[Avatar]

Membro desde: 07/04/2008 21:09:30
Mensagens: 81
Offline

plic_ploc, bacana o exemplo, é parecido com o meu... só q tb cai na mesma limitação . Se vc empacotar ele num jar, ele já não acha as referencias das classes... Ele funciona bem em aplicações web já q as classes ficam "explodidas", mas falha em aplicações desktop.


sergiotaborda, tb olhei esse exemplo q vc me passou e fiz um projeto de teste. Notei que ele não acha nada que ainda não tenha sido utilizado. Você pode me dar algum exemplo de um framework que faça isso (que não seja voltado a web)? Como os pacotes são mapeados?
[Email]
plic_ploc
JavaChild

Membro desde: 11/06/2006 18:55:12
Mensagens: 137
Localização: Ibitinga - SP
Offline

para isso você deve usar o método:


esse método acessa o arquivo META-INF/MANIFEST.MF de todos os jars.

exemplo de um arquivo MANIFEST.MF:

This message was edited 1 time. Last update was at 19/01/2010 15:26:44


Java MVC - Brutos framework
Faça o download de um WebChat feito usando o Brutos MVC
barenko
JavaBaby
[Avatar]

Membro desde: 07/04/2008 21:09:30
Mensagens: 81
Offline

Usei o método e estava dando erro de acesso negado


Ai, adicionei um if no metodo manifest e funcionou:

Manifest 1 testado:

Manifest 2 testado:


Brilhante! Agora preciso ver uma forma dinâmica de pegar o nome da package da classe. Sabe como fazer isso?


[Email]
barenko
JavaBaby
[Avatar]

Membro desde: 07/04/2008 21:09:30
Mensagens: 81
Offline

Melhor ainda:

Tendo como premissa que a classe que faz a carga das classes anotadas NUNCA estará no mesmo pacote das classes que ela mapeará, o if se transforma nisso:



Assim não preciso perder tempo p/ descobrir o nome da package

Vlw plic_ploc e sergiotaborda pela ajuda! Vou fazer mais uns testes. Qq coisa eu posto aqui!

This message was edited 1 time. Last update was at 19/01/2010 16:43:29

[Email]
plic_ploc
JavaChild

Membro desde: 11/06/2006 18:55:12
Mensagens: 137
Localização: Ibitinga - SP
Offline

Essa classe não prevê todos os casos.
No meu entendimento "." equivale ao diretório atual, ou seja, quando ele encontrar "." ele deve verificar o diretório atual.

Troque o código entre as linhas 103 e 106 do código original pelo que se segue:



Não testei o código.

Java MVC - Brutos framework
Faça o download de um WebChat feito usando o Brutos MVC
barenko
JavaBaby
[Avatar]

Membro desde: 07/04/2008 21:09:30
Mensagens: 81
Offline

Pronto, trecho substituído. Só faltou indicar o "file:/" na URL, como abaixo.



Código testado e funcionando! Obrigado!
[Email]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team