Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appeler méthode avec nom de classe variable

Sujet résolu
    16 septembre 2021 à 21:21:51

    Bonjour à tous,

    J'aurais aimé savoir comment je pourrais faire pour appeler une méthode d'une classe dont le nom de la classe serait contenu dans une variable.

    Explication:

    J'ai un certain nombre de fichiers : Tp1_1, Tp1_2, Tp1_3...

    Dans chaque fichiers une classe dans chaque classe une fonction exo

    Dans le Main j'ai une fonction qui récupère le nom de chaque fichier dans un tableau de String qui s'appelle 'names'

    Maintenant j'aimerais (en gros) arriver à faire un truc du genre :

    names[0].exo()

    Mais j'arrive pas à trouver comment faire :(

    Une idée ? (sans passer par un switch de préférence)

    Merci d'avance

    EDIT : J'ai trouvé le getDeclaredClasses(names[0]) mais je comprends pas comment il fonctionne

    RE-EDIT :

    Bon, au final après 3H de galère et un bon gros mal de crâne j'ai réussi :

    import java.io.*;
    import java.lang.*;
    import java.lang.reflect.*;
    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            String [] exos = {"Saisie & Boucles",
                    "Calcul de l'aire d'un trapèze",
                    "Convertisseur Binaire <=> Décimal",
                    "Le jeu du nombre mystère"
            }; // Le nom de chaque exercice
            String [] names = getFilesName("./src/TpJava"); // Récupération du nom des fichiers De classe Tp...
    
            System.out.println("Quel exercice souhaitez-vous tester ?\n");
            for(int i=0; i<names.length; i++){ // Affichage des choix possibles
                System.out.println((i+1) + " - " + exos[i]);
            }
            System.out.print("=> ");
            int choix = coms.getInt(); // Choix Utilisateur
    
            String className =  "TpJava."+names[choix-1]; // Classe à utiliser
            String methodName =  "exo"; // Méthode à utiliser
    
            Class<?> clazz = Class.forName(className); // Création d'une nouvelle classe qui correspond à celle que l'on veut utiliser
            Object o = clazz.newInstance(); // Copie de la classe par le Constructeur
            Method Exo = clazz.getMethod(methodName); // Récupération de la méthode dont on a besoins
            Exo.invoke(o); // Appel de la méthode
    
            if(coms.Restart("Essayer un autre Exercice")){ // Demande de recommencer un autre exercice
                main(null);
            }
        }
    
        public static String [] getFilesName(String folder){
            String[] files={}; // Tableau de récupération des noms de fichiers
            File repertoire = new File(folder);
            String[] liste = repertoire.list(); // Listage des fichiers du répertoire
    
            if (liste != null) {
                for (String s : liste) { // On parcours la liste
                    if (s.contains("Tp")) { // Si "Tp" fait partie du nom du fichier
                        files = Arrays.copyOf(files, files.length + 1); // On augmente la taille du tableau
                        String[] temp = s.split("\\."); // On coupe le nom du fichier au niveau du point
                        files[files.length - 1] = temp[0]; // On garde juste le nom sans l'extension du fichier
                    }
                }
            } else {
                System.err.println("Nom de repertoire invalide");
            }
            return files; // Et on renvoie le tableau
        }
    }

    Et tout ça juste parce que j'ai la flemme de rallonger 1 switch...

    A+

    -
    Edité par Cyprien Siaud 17 septembre 2021 à 1:04:10

    • Partager sur Facebook
    • Partager sur Twitter

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    Appeler méthode avec nom de classe variable

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown