Instanciar classes dinamicamente

18 respostas
java
Gabriel_Arrighi

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?

18 Respostas

lvbarbosa

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.

Gabriel_Arrighi

É essa mesma a minha dúvida. Darei uma melhor estudada nesse pacote.
Obrigado!

Dragoon

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!

Gabriel_Arrighi

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?

Dragoon

Analisar o que?

Reflexão não é dinâmico … é um fator muito a se pensar por vários motivos …

sw? é o que?

Dragoon

Se está fazendo um Software de Analise de Programa testando as classes?

Gabriel_Arrighi

Isso mesmo

Dragoon

O que você testa nessas classes?

Gabriel_Arrighi

Annotations que estão presentes na classe e em cada método da classe

Dragoon

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 …

Gabriel_Arrighi

Obrigado pela contribuição!
É para desktop o software.

wldomiciano

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:

H

Cara,coloca o código aqui que talvez a gente consiga te ajudar melhor…

Gabriel_Arrighi
public @interface CustomTypeAnnotation {
    public enum Priority{
        LOW, MEDIUM, HIGH
    }
    
    Priority priority() default Priority.MEDIUM;
    String[] tags() default "";
    String createBy() default "";
    String lastModified() default "";
}
Gabriel_Arrighi

Essa é a annotation padrão

Gabriel_Arrighi
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);
            }
            
        }
    }
}
Gabriel_Arrighi

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.

staroski

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.

Criado 9 de julho de 2019
Ultima resposta 10 de jul. de 2019
Respostas 18
Participantes 6