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

Collection et Stream Java Discussion :

Réflection : Appel constructeur avec tableau de classe


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut Réflection : Appel constructeur avec tableau de classe
    Bonjour,

    J'utilise une méthode pour instancier des objets directement par les classes associés, dont l'extrait est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Object constructeur(String classe, Class[] classesParam, Object[] arguments) {
     Class<C> classe = Class.forName(classe);
     Constructor<C> constructeur = classe.getConstructor(classesParam);
     Object résultat = constructeur.newInstance(arguments);
    }
    // Appel
    constructeur("Test",new Class[] {String.class,Object.class},new Object[] {"strParam1",monObjet2});
    // La classe Test serait
    public class Test {
     public Test(String param1, Object param2){}
    }
    Jusque là, pas de soucis. Mais l'une de mes classe utilise dans le constructeur des tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Test {
     public Test(String[] param1, Object[] param2){}
    }
    J'essai ceci, mais sans résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String[] param1 = {"A","B"};
    Object[] param2 = {MonObjetA,MonObjetB};
     
    Class[] classString = {String.class};
    Class[] classObject = {Object.class};
    constructeur("Test",new Class[] {classString,classObject},new Object[] {param1,param2});
    Mais j'obtiens l'erreur de conversion de Class[] vers Class sur le champ "classString" (alors qu'il l'accepte pour param1).

    Comment dois-je paramétrer l'appel ? Ou si je ne peux pas utiliser la même méthode, comment utiliser "classe.getConstructor(classesParam);" (arguments et appels) ?
    Merci !

    --------------------------------
    Bah j'ai trouvé la solution, en cherchant à l'inverse par la méthode getConstructors() de la classe Class :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String[] param1 = {"A","B"};
    Object[] param2 = {MonObjetA,MonObjetB};
     
    Class classString = Class.forName("[Ljava.lang.String;");
    Class classObject = Class.forName("[Ljava.lang.Object;");
    constructeur("Test",new Class[] {classString,classObject},new Object[] {param1,param2});

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je suis à peu près sûr qu'avec un mix de pattern factory et d'autres patterns adaptés à quoi que ce soit qu'on essaie de faire ici, il y a moyen de faire beaucoup plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Pourquoi faire simple quand on peut faire compliqué ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class classString = Class.forName("[Ljava.lang.String;");
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class classString = String[].class;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class classObject = Class.forName("[Ljava.lang.Object;");
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class classObject = Object[].class;


    Voire encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String[] param1 = {"A", "B"};
    Object[] param2 = {monObjetA, monObjetB};
     
    constructeur("Test", new Class[]{param1.class, param2.class}, new Object[]{param1, param2});

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/01/2013, 16h25
  2. tableau de classe avec constructeur non copiable
    Par pixelou dans le forum Débuter
    Réponses: 3
    Dernier message: 22/02/2010, 23h09
  3. [Perl Objet] Constructeur avec tableau en parametre
    Par crochepatte dans le forum Langage
    Réponses: 9
    Dernier message: 16/08/2006, 22h07
  4. Réponses: 14
    Dernier message: 02/08/2006, 18h37

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