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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    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 chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    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 expérimenté

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    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 expérimenté

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    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 confirmé
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    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 chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    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 confirmé
    Inscrit en
    Avril 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 57
    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
    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...

+ 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