API manipulação de arquivo .java

7 respostas
remixlara

Galera, tenho uma duvida simples.

Atualmente estive pesquisando sobre alguma API que manipule arquivos .java que faz sua análise e possibilite a recuperação do nome das classes declaradas dentro desse arquivo, todos os métodos e atributos das respectivas classes.

Infelizmente não encontrei nada relacionado e implementar isso será mto demorado.

Será que existe algo assim?

Ficarei grato se alguem puder me passar essa informação.

Vlw

7 Respostas

Marky.Vasconcelos

Voce nao precisa manipular o arquivo .java, voce tem o Reflection que te possibilita verificar via Java os métodos, atributos e anotações das classes.

Mas tudo depende do que voce quer fazer.

remixlara

Tipo, eu estava lendo sobre isso agora e realmente funciona como eu queria.

Mas o problema é que essa classe é externa aos pacotes do sistema.

No meu sistema o individuo selecionaria uma pasta que contém várias classes .java

e meu sistema armazenaria tudas as informações sobre essas classes.

Pelo que eu percebi por reflection é feito da seguinte forma:

Class cls = Class.forName("br.com.batuquetecnologias.Area");
			
for (Method m : cls.getDeclaredMethods()) {
   System.out.println(m.getName());
}

A questão eh que eu queria fazer isso de um diretório externo. Tem como?

Vlw Mark_Ameba. =D

Marky.Vasconcelos

De uma maneaira fácil não.

Voce precisa ter essas classes carregadas no ClassLoader, até ai não é dificil usar o URLClassLoader para carregar os arquivos compilados, mas algo que falta na API Reflection é uma maneira de descobrir todas as classes de um package.

Ou voce pode armazenar o diretorio de onde voce carregou as classes de depois usar essa referencia para procurar dentro do sistema, mas isso vai dar um pouco de trabalho.

remixlara

Vlwwww.

Vou dar uma estudada nisso e qualquer coisa eu lanço aqui como eu fiz.

Obrigadão ae!

=D

remixlara

Ae, graças a Deus consegui… =D

Graças a sua dica Mark_Ameba dei uma pesquisada melhor e entendi como funciona tudo.

Vou por o código aqui

File file = new File("C:\\modelo\\"); //Pasta que contém os arquivos .class
			
URL classUrl = file.toURL();
			
URL[] classUrls = { classUrl }; //Como o construtor do URLClassLoader é um array é necessário fazer isso
			
URLClassLoader ucl = new URLClassLoader(classUrls);
			
Class c = ucl.loadClass("Teste"); // Arqui você carrega a classe que deseja
			
for(Field f: c.getDeclaredFields()) {
     System.out.println("Atributo - " + f.getName());
}
Marky.Vasconcelos

Voce ainda pode fazer outra coisa, e carregar essas classes no ClassLoader padrão.

File file = new File("C:\\modelo\\"); //Pasta que contém os arquivos .class
			
URL classUrl = file.toURL();
URLClassLoader loader = (URLClassLoader) System.class.getClassLoader();
	Method addUrl = URLClassLoader.class.getDeclaredMethod("addUrl", URL.class);
	addUrl.setAccessible(true);
	addUrl.invoke(loader, classUrl);
	
			
Class c = ucl.loadClass("Teste"); // Arqui você carrega a classe que deseja
			
for(Field f: c.getDeclaredFields()) {
     System.out.println("Atributo - " + f.getName());
}
remixlara

Isso =D

vlw pela ajuda.

Criado 28 de março de 2010
Ultima resposta 7 de abr. de 2010
Respostas 7
Participantes 2