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
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.
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
Confucius