Fala, galera!
Estou com uma dúvida.
Por exemplo, estou com uma pasta cheia de arquivos .java.
Na main de um arquivo fora desta pasta, quero instanciar objetos do tipo classe de cada arquivo .java. Quero fazer isso sem ser manualmente (Class c = new Class() ).
Alguém sabe como fazer?
Instanciar classes dinamicamente
18 Respostas
Não entendi o que você quer.
Você falou que tem arquivos .java numa pasta e quer acesso às classes definidas neles durante o runtime de outro programa Java? Se é isso, o pacote javax.tools tem ferramentas pra você compilar arquivos .java para bytecode durante o runtime.
É essa mesma a minha dúvida. Darei uma melhor estudada nesse pacote.
Obrigado!
a duvida é tão estranha, porque, se fosse um container sim isso acontece no mundo Web … mas, instancia manualmente sem contexto fica complicado responder?
Diga passo a passo o que precisa, está muito vaga a sua pergunta!
Estou criando um sw de analise de qualidade de programas.
Ele tem como input o local dos arquivos .java
Com isso, quero analisar cada uma.
Para isso, tenho que criar objetos do tipo Class (classe genérica) para poder analisá-las via reflexão.
Conseguiu entender?
Analisar o que?
Reflexão não é dinâmico … é um fator muito a se pensar por vários motivos …
sw? é o que?
Se está fazendo um Software de Analise de Programa testando as classes?
Isso mesmo
O que você testa nessas classes?
Annotations que estão presentes na classe e em cada método da classe
Agora eu consegui entender um contexto plausível, aonde você está desenvolvendo um aplicativo (que ainda não sei se é Web ou Desktop) para testar metadados de classes, anotações! Bom vamos ver agora alguém que manja em Java te dar um norte para que você possa entender as suas duvidas …
Obrigado pela contribuição!
É para desktop o software.
O que acontece se as annotations estiverem presentes como esperado? E o que acontece caso elas não estejam presentes?
Será que o que vc precisa não seria um Annotation Processor? Aqui tem um tutorial sobre:
Cara,coloca o código aqui que talvez a gente consiga te ajudar melhor…
public @interface CustomTypeAnnotation {
public enum Priority{
LOW, MEDIUM, HIGH
}
Priority priority() default Priority.MEDIUM;
String[] tags() default "";
String createBy() default "";
String lastModified() default "";
}
Essa é a annotation padrão
public class Teste {
public static void main(String[] args){
String diretorio = ""; //aqui seria o caminho do diretório da pasta do projeto
String[] aux = diretorio.split("/");
File file = new File(diretorio);
String pacote = "";
for(int i = 1; i < aux.length; i++){
pacote = pacote + aux[i] + ".";
}
//System.out.println(pacote);
//System.out.println("");
for(File arquivo : file.listFiles()){
System.out.println(arquivo.getName());
try{
Class<?> obj = Class.forName(pacote+arquivo.getName().replace(".java", ""));
//processa a annotation
if(obj.isAnnotationPresent(CustomTypeAnnotation.class)){
Annotation annotation = obj.getAnnotation(CustomTypeAnnotation.class);
CustomTypeAnnotation custom = (CustomTypeAnnotation) annotation;
System.out.println("Priority: "+custom.priority());
System.out.println("CreatedBy: "+custom.createBy());
System.out.println("Tags: ");
for(String tag : custom.tags())
System.out.print(tag+" ");
System.out.println("");
System.out.println("LastModified: "+custom.lastModified());
}
} catch(Exception e){
System.out.println(e);
}
}
}
}
essa é a classe de teste.
o único proble é que está dando o seguinte erro:
java.lang.ClassNotFoundException
o caminho do diretório contém os .java e annotation padrão (CustomTypeAnnotation).
Na pasta da classe Teste contém também a annotation padrão.
Mas no código que você postou você não está compilando os arquivos .java.
Tenha em mente que o Class.forName só é capaz de carregar objetos Class se os seus respectivos arquivos .class estiverem no classpath da aplicação.