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
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.
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
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.
Vlwwww.
Vou dar uma estudada nisso e qualquer coisa eu lanço aqui como eu fiz.
Obrigadão ae!
=D
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());
}
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());
}