IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Appeler une classe en fonction de son nom


Sujet :

Langage Java

  1. #1
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut Appeler une classe en fonction de son nom
    Bonjour à tous,

    Dans une classe je récupère un ArrayList<String> avec le nom des classes.
    J'ai différentes classes qui implémentent une interface.
    Ce que je dois faire c'est appeler la bonne classe sans différencier càd sans faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(tableau.get(i) = "Classe1")....
    Il y moyen d'y parvenir au travers d'un Object mais je n'y arrive pas =/
    Je cherche depuis hier, on m'a parlé de méthodes telles que 'getClassByName()' ou 'getObjectByName()' mais je n'ai pas réussi à trouver.

    Quelqu'un aurait-il une idée?

    merci d'avance.

    <Nutella>
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Regarde du côté de l'API de réflexion (package java.lang.reflect).

    Sinon, ce dont tu as besoin, c'est peut-être de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class taClasse = Class.forName("NomDeTaClasse");
    Au passage, pour obtenir une classe à partir de son nom, celui-ci doit être complet, c'est-à-dire, inclure le package. Par exemple, tu dois utiliser "java.lang.String" pour une chaîne de caractères.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    J'ai regardé reflect mais je n'y ai rien trouvé.
    J'avais déjà testé ce que tu me proposes mais ça n'avait pas fonctionné.
    Comme tu le précises, il faut bien utiliser le package pour faire appel.

    J'ai testé ça (reste à voir si je suis sur la bonne voie)

    Classes : Classe1 et Classe2
    Interface : I

    package : monitoring

    Méthode des classes : coucou()
    Classe1 méthode coucou() : System.out.println("coucou de la classe1");
    Classe2 méthode coucou() : System.out.println("coucou de la classe2");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                ArrayList<String> cl = new ArrayList<String>();
                cl.add("Classe1");
                cl.add("Classe2");
     
                for(int i = 0; i < cl.size(); i++)
                {
                    I test = new monitoring.Classe1();
                    test.coucou();
                }
    Le problème c'est qu'ici je crée toujours un objet de type Classe1...

    je vais continuer à chercher

    (Merci bien pour ta réponse)
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

  4. #4
    Membre habitué Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Points : 131
    Points
    131
    Par défaut
    Tu confonds la classe et l'instance :
    • Tu n'utilises pas ton tableau c1 avec le nom des classes.
    • Tu crée une instance de Classe1 à chaque itération !

    Donc c'est normal que tu lises à chaque fois
    Il faut qu'à chaque itération :
    • tu récupères la classe selon son nom,
    • tu crée une instance d'objet de cette classe, même si tu la déclares comme interface I.

    Voici le code (à compléter par la gestion des exceptions !!!) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    List<String> cl = new ArrayList<String>();
    cl.add("monitoring.Classe1");
    cl.add("monitoring.Classe2");
     
    for (String c : cl) {
    	I test;
    	try {
    		Class classe = Class.forName(c);
    		test = (I) classe.newInstance();
    		test.coucou();
    	} catch (InstantiationException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IllegalAccessException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (ClassNotFoundException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }

  5. #5
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Oui c'est ce que je sous-entendais par
    Le problème c'est qu'ici je crée toujours un objet de type Classe1...
    La façon dont je procédais ne créais que des Class1 ce qui était logique.

    J'étais parti sur la même idée mais après cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class classe = Class.forName(c);
    je ne voyais pas ce que je pouvais faire avec la variable classe.

    Un grand merci à vous 2.

    < Nutella >
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Tout dépend de ce que tu veux en faire toi
    A quoi te sert la liste c1, à stocker toutes les classes dont tu as besoin ?
    Pensez au tag quand votre problème est réglé !

  7. #7
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Oui je récupère les noms des classes dans une db.

    Comme ça si on ajoute une classe dans la db, elle est reprise et instanciée sans modifier mon code.
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    D'accord. En plus du code posté par jean.2edi, je pense que le sujet Instancier une classe par son nom devrait répondre à tes attentes.
    Pensez au tag quand votre problème est réglé !

  9. #9
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Merci bien, je vais jeter un oeil
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler une méthode d'objet via son nom à l'exécution
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/02/2013, 11h51
  2. Réponses: 1
    Dernier message: 29/12/2009, 16h59
  3. Supprimer une feuille en fonction de son nom
    Par FCL31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/09/2009, 17h34
  4. cocher une checkbox en fonction de son nom
    Par boss_gama dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/09/2006, 16h42
  5. Réponses: 7
    Dernier message: 10/11/2005, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo