Accueil > Forum > > > > Instanciation d'une classe dont le nom est dans une variable
Instanciation d'une classe dont le nom est dans une variable
mercredi 16 janvier 2008 à 10:02:32 |
Instanciation d'une classe dont le nom est dans une variable

sphaxslayer
|
Bonjour tout le monde, voilà j'ai un petit souci qui est en fait je pense la question la plus tordue du monde entier et de l'univers. J'ai un système d'héritage de classes Filtres. Chaque nom de classe (et donc du fichier .java...) est enregistré en base et donc récupérable. Ces "filtres" sont sélectionnés et on construit un ArrayList de leur noms en fonction de ceux qu'on a sélectionnés. Ma question est la suivante : est-il possible de déclarer une variable dont le type serait la valeur d'une autre. Exemple : new (ArrLst.get(0)) filter1; new (ArrLst.get(1)) filter2; avec ArrLst.get(0) == MathFilter , ArrLst.get(1) == PunctuationFilter et 2 classes existantes : MathFilter.java, PunctuationFilter.java Merci d'avance... Bien qu'à mon avis, la réponse est claire :(
 "Un seul Être vous manque, et tout est dépeuplé..." 
|
|
mercredi 16 janvier 2008 à 11:56:23 |
Re : Instanciation d'une classe dont le nom est dans une variable

KenZara
|
Bonjour, A mon avis ce que tu cherches à faire n'est pas possible :/ .... Mais détaille nous un peu plus, il se peut que j'ai mal compris ce que tu veux faire. En tout cas faire ça: ArrLst.get(0) == MathFilter sachant que le MathFilter est le nom de la classe, hum je ne pense pas... Voilou ... Sinon j'adore ton message de fin :) ... Kenza 
|
|
mercredi 16 janvier 2008 à 12:54:56 |
Re : Instanciation d'une classe dont le nom est dans une variable

Twinuts
|
Réponse acceptée !
Salut,
en gros si je comprend bien tu veux créer une instance d'un objet sans passer par sa référence directe mais seulement par son nom.
Bah jusque là aucun problème en java c'est faisable. Pour ce faire tu dois utiliser le mécanisme de réflexion... voici deux solutions (les plus courantes) : 1 - L'objet que tu veux instancier possède un constructeur vide (sans argtuments). 2 - L'objet que tu veux instancier contient 1 ou plusieurs constructeurs avec argument.
solution 1 : L'exemple ci-dessous montre comment instancier la classe java.util.Random (te suffit d'adapter pour ton code)
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) { // Note : ce bout de code trapue toutes les exception, et ne fait pas de test sur la validité // des champs. // ATTENTION: l'utilisation de la réflexion alourdi le temps de traitement d'un code try { // Lorsque tu veux instancier un objet par son nom il te faut le nom complet // soit le nom de ton objet mais pas seulement, il te faut également // connaître l'emplacement de ta classe (dans quel package elle se trouve). String className = "java.util.Random"; // la méthode forName(...) permet de demander à la JVM de trouver le byte code // associé à un objet Class, afin de pouvoir le manipuler ultérieurement. Class<?> classRandom = Class.forName(className); // Affichage de la classe. System.out.println(classRandom); // Demande à la JVM de trouver le constructeur vide de ton objet // afin de créer une instance dessus. Object objectRandom = classRandom.newInstance(); // Affichage de l'instance sur l'objet Random. System.out.println(objectRandom); // Invocation d'une méthode afin de tester si tout ce passe comme prévu ^^. // La première étape consiste à trouver la méthode dans l'objet Random // pour le test nous allons nous intéresser à la méthode nextInt(int). Method nextInt = classRandom.getMethod( "nextInt", // Nom de la méthode qui nous intéresse. // Il faut ensuite indiquer le type des paramètres de la méthode // en l'occurrence ici on choisi la méthode ayant un paramètre de type int. new Class[] { int.class } ); // Affichage de la méthode System.out.println(nextInt); // Maintenant il suffit d'invoquer la méthode en question et de traiter le résultat. Object result = nextInt.invoke( objectRandom, // Référence sur l'objet propriétaire de la méthode. // Il faut ensuite indiquer la valeur des paramètres de la méthode // en l'occurrence ici on a choisi la méthode ayant un paramètre de type int // donc on lui met une valeur... par exemple... "50". new Object[] { 50 } ); // Exploitation du retour de la méthode (nextInt retourne un entier). int value = (Integer)result; // Affichage de la valeur System.out.println(value); } catch(Exception e) { e.printStackTrace(); } } }
solution 2: L'exemple ci-dessous montre comment instancier la classe java.io.File (te suffit d'adapter pour ton code) import java.lang.reflect.Constructor; import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) { // Note : ce bout de code trappe toutes les exception, et ne fait pas de test sur la validité // des champs. // ATTENTION: l'utilisation de la réflexion alourdi le temps de traitement d'un code try { // Lorsque tu veux instancier un objet par son nom il te faut le nom complet // soit le nom de ton objet mais pas seulement, il te faut également // connaître l'emplacement de ta classe (dans quel package elle se trouve). String className = "java.io.File"; // la méthode forName(...) permet de demander à la JVM de trouver le byte code // associé à un objet Class, afin de pouvoir le manipuler ultérieurement. Class<?> classFile = Class.forName(className); // Affichage de la classe. System.out.println(classFile); // Maintenant il faut spécifier le type de constructeur à utiliser afin de créer une instance de la classe File // Pour ce faire, on utilise l'objet Constructor du package reflect. // L'instance de l'objet Constructor ce fait par l'intermediaire de la méthode getConstructor en spécifiant le constructeur // de notre choix, soit ici celui qui prend en paramètre un String Constructor<?> constructorFile = classFile.getConstructor(new Class[] {String.class}); // Affichage de l'instance sur l'objet Constructor de la classe File. System.out.println(constructorFile); // Demande à la JVM de trouver le constructeur prenant en paramètre un String // afin de créer une instance dessus. Object objectFile = constructorFile.newInstance(new Object[] { "./fichier.txt" }); // on passe en paramètre le nom d'un fichier pour que la classe File se cale dessus ^^ // Affichage de l'instance sur l'objet File. System.out.println(objectFile); // Invocation d'une méthode afin de tester si tout ce passe comme prévu ^^. // La première étape consiste à trouver la méthode dans l'objet File // pour le test nous allons nous intéresser à la méthode exists(). Method exists = classFile.getMethod( "exists", // Nom de la méthode qui nous intéresse. // Il faut ensuite indiquer le type des paramètres de la méthode // en l'occurrence ici on choisi la méthode n'ayant aucun paramètre. new Class[] {} ); // Affichage de la méthode System.out.println(exists); // Maintenant il suffit d'invoquer la méthode en question et de traiter le résultat. Object result = exists.invoke( objectFile, // Référence sur l'objet propriétaire de la méthode. // Il faut ensuite indiquer la valeur des paramètres de la méthode // en l'occurrence ici on a choisi la méthode n'ayant aucun paramètre. new Object[] {} ); // Exploitation du retour de la méthode (exists retourne un boolean). boolean value = (Boolean)result; // Affichage de la valeur System.out.println(value); } catch(Exception e) { e.printStackTrace(); } } }
------------------------------------ "On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
OoWORAoO
|
|
mercredi 16 janvier 2008 à 13:20:31 |
Re : Instanciation d'une classe dont le nom est dans une variable

sphaxslayer
|
Salut, et merci de ta réponse.. Effectivement tu as bien compris à mon avis, j'aurais voulu pouvoir instancier un objet d'un type donné par la valeur d'une variable, c'est bien ça... Tant pis, en "bricolage" j'ai fait un bloc de if..else if... laid pas beau (pour l'instant j'ai que 3 classes de filtres, mais dans un temps t à venir, il se pourrait qu'il y en ait une petite dizaine par exemple...) ... ahh... si le switch marchait sur les chaînes de caractères en Java... Quant à ma signature, il s'agit d'une citation d'Alphonse de Lamartine, parodié d'ailleur par Woodie Allen en "Un seul être vous manque et c'est justement celui qui vous doit de l'argent" ou quelque chose du genre :-) Merci en tous cas, de confirmer ma supposition... J'ai feinté pour le moment, je pense que le système général de nos classes est à reprendre mais bon...
 "Un seul Être vous manque, et tout est dépeuplé..." 
|
|
mercredi 16 janvier 2008 à 13:26:11 |
Re : Instanciation d'une classe dont le nom est dans une variable
|
Cette discussion est classée dans : variable, classe, get, instanciation, arrlst
Répondre à ce message
Sujets en rapport avec ce message
Pb récupérer valeur d'une variable [ par jleyaoua ]
Bonjour, Je dois faire un petit serveur avec une interface. J'ai déclaré dans ma classe UIServeur une variable:"public boolean etat = true; " j'affect
Recuperation variable d'une autre classe [ par Djumb ]
Bonjour je debute en java j'ai des notions de Vb.j'ai 3 fichiers .java et je voudrai que mon premier fichier (qui possede le main) contienne toute les
probleme avec le changement de couleur [ par sparetime ]
bonjourj'ai une classe qui fait du graphique et dans laquelle je modifie la couleur selon l'etat d'une variable qui se trouve dans une deuxieme classe
problème en java [ par hibaw ]
Bonjour,j'ai une variable commun entre mes classes java, où chaque classe utilise la valeur actualisé de la variable ( en excécution), ça me pose aucu
Classe qui écoute une de ses variable de classe [ par benny627 ]
Bonjour dans le cadre du développement d'une application graphique, je suis en train de créer une Classe de type JPanel qui est entre autre chargée d'
quelle difference entre static et non static dans une classe [ par linoufra ]
Bonjour ,j ' aimerai connaitre la difference entre staic et non static dans une classe permettante d instancier des objets ( sans main).d ' apres ce q
attribut [ par lamia88 ]
bonjours, j'ai crée une variable dans la classe nommé "classe1",et je dois utilisé la valeur de cette variable dans une autre classe nommé "classe2".
Utiliser une variable d'une classe dans une autre classe en java [ par Manyanya ]
Salut, J'ai une difficulté ! J'ai construit une classe en java où une lecture dans une base des données doit être réalisée. Mais tout au long de mon
Probleme basique Java2 [ par _jules_ ]
bjr tlm !Voila g un soucis au niveau des méthodes & de passages de variables d'une classe a la classe principale ;en fait déjà je comprend pas trop l'
Probleme ClassCastException [ par dinous ]
public long calculPoids(){ long poids =0; //System.out.println(this.listFiles().length); for (int i =0;i { if (this.listFi
Livres en rapport
|
Derniers Blogs
[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi
Forum
AIDEAIDE par mlawah
Cliquez pour lire la suite par mlawah RE : J2EERE : J2EE par issats1987
Cliquez pour lire la suite par issats1987 RE : J2EERE : J2EE par abdouffff
Cliquez pour lire la suite par abdouffff RE : J2EERE : J2EE par issats1987
Cliquez pour lire la suite par issats1987
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|