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

Java Discussion :

Creation dynamique d'objet


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut Creation dynamique d'objet
    Bonjour,

    imaginons que j'ai une classe du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Book {
     
    	private int number;
    	private String title;
    	private Short year;
    	...
    Dans une autre methode j'aimerai créer un new String s'il je travaille avec "title",
    un new Short si je travaille avec "year"...
    En bref, dans une methode, je passe en parametre le nom du champ (ici, "title", "year", "number"...), et j'aimerai creer une instance de meme type que le champ spécifié.
    J'ai vu que je pouvais recupérer le type avec par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Book.class.getDeclaredField("year").getType()
    qui me retourne alors "class java.lang.Short".
    Avec ça, comment lui dire de me créer un nouveau Short dans le code de mon programme?
    Si "year", avait été declaré String, dans le corps de ma methode, je crée un parametre x de type String.
    Si "year" était Integer, je cree x comme new Integer.
    Comment faire, sachant que je parle de la classe "Book", mais il y en a d'autres en jeu ?
    Merci pour l'attention que vous porterez a mon probleme !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Salut,

    si j'ai bien suivi, tu n'es vraiment pas loin, il te manques juste un newInstance() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Book.class.getDeclaredField("year").getType().newInstance()
    Par contre je sais plus trop ce que ça donne avec les types primitifs (je pense que ça te renverra une instance objet equivalente : Integer au lieu de int).

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    Points : 467
    Points
    467
    Par défaut
    J'imagine que tu peux faire:
    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
     
    public Object tamethode(Class taClasse, String nomAttribut){
            Class typeAttribut = null;
            try {
                 typeAttribut = taClasse.getDeclaredField(nomAttribut).getType();
            } catch (SecurityException ex) {
                ex.printStackTrace();
            } catch (NoSuchFieldException ex) {
                ex.printStackTrace();
            }
            if(typeAttribut == Short.class)
                  return new Short();
            else if(typeAttribut == Integer.class)
                  return new Short();
            else if(typeAttribut == String.class)
                  return new String();
            //...
            else return null;
    }

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    Points : 467
    Points
    467
    Par défaut
    C'est moins pratique que ce que propose gailuris mais tout dépend de ce que tu vas faire avecles objets crées.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    merci pour vos reponses.
    L'astuce de gailuris est geniale.
    J'y etais presque mais le probleme, c'est que j'aimerai instancier mon nouvel objet.
    la methode .newinstance() me renvoie un objet null.
    Alors que j'aimerai faire l'equivalent d'un new Short("10") par exemple .
    Et alors la, le methode de Yannart est parfaite parce qu'il me suffit de rajouter la valeur a instancier dans les parametres de la methode.
    Mais c'est pas tres pratique parce qu'il faut que j'anticipe tous les types que je suis susceptible de rencontrer.
    Ya pas un moyen d'arranger l'astuce elegante de gailuris ?

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Yop,

    Si je comprend bien tu ne veux créer des instances de classes qui possédent forcément un constructeur prenant une chaine en paramètres, si c'est le cas j'ai encore mieux (il faut vraiment éviter ce genre de tests sur les types de classes...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typeAttribut = taClasse.getDeclaredField(nomAttribut).getType();
    Class[] paramConstructeur = {String.class};
    Constructor constructeur = typeAttribut.getDeclaredConstructor(paramConstructeur ); // Je récupére le constructeur ayant une String en paramètre
    Object[] param = {"10"};
    Objet monInstance = constructeur.newInstance(param);
    Voila, tu peux étudier les classes du package reflect pour plus de détails la dessus.

    Ma prière solution faisait exactement la meme chose mais paramConstructeur et param auraient été des tableaux vides.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    merci beaucoup.
    C'est exactement tout ce que je souhaitais !

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    L'introspection n'a rien à faire ici, il suffit de faire une création par une méthode statique qui te renvoie un objet du bon type...

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par ®om
    L'introspection n'a rien à faire ici, il suffit de faire une création par une méthode statique qui te renvoie un objet du bon type...
    Je ne comprend pas ce que tu veux dire... (ça m'intéresse parce que si tu ne te trompes pas ça veut dire que j'ai fait n'imp à chaque fois que j'ai eu ce genre de problèmatique ).

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par gailuris
    Je ne comprend pas ce que tu veux dire... (ça m'intéresse parce que si tu ne te trompes pas ça veut dire que j'ai fait n'imp à chaque fois que j'ai eu ce genre de problèmatique ).
    En fait j'ai peut être été trop catégorique...

    Ca dépend de ce que tu souhaites faire (dans quel contexte tu veux utiliser cela).
    Si c'est parce que tu lis par exemple des noms d'attributs configurés dans un fichier XML (comme pour les EJB 2), effectivement il faut l'introspection. Mais dans un programme "courant", c'est souvent une erreur d'utiliser l'introspection, il faudrait que j'en sache un peu plus sur le pourquoi ?

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par ®om
    En fait j'ai peut être été trop catégorique...

    Ca dépend de ce que tu souhaites faire (dans quel contexte tu veux utiliser cela).
    Si c'est parce que tu lis par exemple des noms d'attributs configurés dans un fichier XML (comme pour les EJB 2), effectivement il faut l'introspection. Mais dans un programme "courant", c'est souvent une erreur d'utiliser l'introspection, il faudrait que j'en sache un peu plus sur le pourquoi ?
    Ah ouf j'ai fait ce genre d'utilisation pour ce genre de cas (nom de classes et d'attributs dans des fichiers de confs).
    Par contre dans le cas de funkadelic je ne sais pas j'ai continué sur cette piste puisque c'était la sienne

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

Discussions similaires

  1. creation dynamique d'objets avec souris
    Par guitariste dans le forum JavaFX
    Réponses: 4
    Dernier message: 04/04/2009, 17h11
  2. creation dynamique d'objet
    Par dz_robotix dans le forum C++Builder
    Réponses: 15
    Dernier message: 13/03/2007, 09h51
  3. [3.0][XAML] Création dynamique d'objets graphiques
    Par Yaugzebul dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 20/11/2006, 15h37
  4. Réponses: 8
    Dernier message: 04/09/2003, 16h07
  5. Creation dynamique d'un objet
    Par Tom_sawyer13 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/08/2003, 18h31

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