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

API standards et tierces Java Discussion :

[Reflect] Créer un array d'objets avec le nom de leur classe


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut [Reflect] Créer un array d'objets avec le nom de leur classe
    Avec le nom d'une classe, on peut créer une instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName("org.me.MyClass").newInstance();
    Mais comment faire pour avoir un array?
    Autrement dit faire mais avec la réflection.
    "MyClass" peut être donné comme String ou même Class (via getType) directement. C'est surtout l'instanciation de l'array qui m'intéresse.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peus déclarer un Tableau d'Object et le remplir d'instances de MyClass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object[] myClasses = new Object[x];
    for(int i = 0; i < x; i ++) {
         myClasses[i] = Class.forName("org.me.MyClass").newInstance();
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut
    Mais je reste avec un Object[] alors que j'ai besoin d'une référence sur un array de MyClass...

    En fait, j'ai une référence à affecter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* addmettons que container contienne un member de type MyClass */
    container.myClass = new Object[0]; /* => type mismatch, en fait: IllegalArgumentException avec Field.set(object, value) */
    container.myClass = new MyClass[0]; /* => c'est cela qu'il me faut */

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il te suffit de transtyper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Class clazz = Class.forName("org.me.MyClass");
     
    Object[] myClasses = new Object[x];
    for(int i = 0; i < x; i ++) {
         myClasses[i] = clazz.newInstance();
    }
     
    /* ... */
     
    container.myClass = (MyClass) myClasses[0];
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    ... et en utilisant Array.newInstance je pense que ça fait tout de même mieux ce qu'on pense en plus rapide

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut
    Citation Envoyé par spekal
    ... et en utilisant Array.newInstance je pense que ça fait tout de même mieux ce qu'on pense en plus rapide
    Array.newInstance retourne un Object, comment caster çà en MyClass[] ?

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut
    Citation Envoyé par le y@m's
    Il te suffit de transtyper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    container.myClass = (MyClass) myClasses[0];
    Ce code n'utilise pas la réflection pour le casting.
    Class.getName() retourne un format particulier dans le cas des arrays:
    http://java.sun.com/j2se/1.5.0/docs/...html#getName()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fieldClassName = "[Lorg.me.MyClass;"; /* retourné par Class.getName() */
    Class.forName(fieldClassName.substring(2, fieldClassName.length()-1) + "[]").cast(new Object[0])
    Et là j'ai une ClassNotFoundException, probablement à cause des "[]" ...

    Mais c'est bien un array de MyClass que je veux instancier.

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

Discussions similaires

  1. Comment créer un array à deux dimensions avec une boucle
    Par m4riachi dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/05/2015, 16h17
  2. Réponses: 4
    Dernier message: 13/06/2014, 11h37
  3. Créer un array d'objets
    Par iBadGamer dans le forum jQuery
    Réponses: 1
    Dernier message: 31/10/2013, 16h11
  4. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  5. [Débutant] Créer une instance avec le nom d'une classe
    Par Quetzalcoatl dans le forum Langage
    Réponses: 7
    Dernier message: 23/01/2006, 20h43

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