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

avec Java Discussion :

Instancier dynamiquement et récupérer dynamiquement


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut Instancier dynamiquement et récupérer dynamiquement
    Bonjour à tous,

    Voilà mon problème. Je souhaite appeler une méthode en précisant un type de class dans les paramètres :

    Par exemple : chercher une collection de voiture rouge dans un format de catégorie
    ArrayList<Voiture> collecVoiture = rechercheCollection("Rouge", Categorie.class );

    L'idée que je cherche à faire est de la réflexisité sur la méthode qui va traiter ceci. Je cherche à faire une class qui me renverra une collection dans un format non défini d'avance, avec le type préciser dans les paramètres.

    Dans le genre :
    public static ArrayList<Class> rechercheCollection(String couleur, Class typeObjet) {

    Instancier le type "Catégorie" pour mon exemple
    Je vois pas quoi mettre

    return ???
    }

    Je ne pense pas être très clair, mais l'idée, c'est que je souhaite :
    - Appeler une méthode générique qui doit prendre un type de class en paramètre
    - instancier le type rentré en paramètre
    -Faire pleins de traitement sur cette instance
    - Retourné une collection de ce type de paramètre

    Merci d'avance
    Sylvain

  2. #2
    Membre éprouvé Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Par défaut
    Salut.
    Si j'ai bien compris l'idée il faut que tu crée une classe mère ou une interface qu'on va appelé Format.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Categorie{
      public enum {color1,color2, etc...};
      abstract Array<Object> getColorCollection(int color);
    }
    Je ne sais plus si on a l'enum aussi en Java. Sinon tu déclares une constante static pour chaque couleur. Je préfère avoir un enum que tester une string pour savoir si elle correspond à telle ou telle chaine.
    Et donc chacunes de tes catégories doivent hériter de l'interface Categorie et implémenter getColorCollection.
    J'ai mit un tableau d'object mais si tu as une mère genre Voiture ou Vehicule tu peux renvoyer celle ci dans le tableau pour eviter un cast par la suite.

    Et donc pour ton exemple ça donnerai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static ArrayList<Object> rechercheCollection(int color,	Categorie categorie) {
     
    return categorie.getColorCollection(color);
    }
    J'espère avoir été assez clair ^^

  3. #3
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut
    Salut,

    merci pour ta réponse

    Bon, en fait, ce n'est pas ce que je cherche. J'ai bien avancé, mais je bloque toujours sur un point.

    Voilà ce que j'ai :
    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
    23
    24
    25
    26
    27
    28
    public static ArrayList<?> rechercheCollection(String arboresence,
    		Class<?> typeObjet) {
     
    		String nom = typeObjet.getName();
    			try {
    				Class cl = Class.forName(nom);
    					Object o = cl.newInstance();
    					collecUnite.add(o);
    				}
    				return collecUnite;
     
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InstantiationException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
     
    			} catch (SecurityException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    Ce que je souhaite maintenant, c'est avoir accès aux setters de la class "o"

  4. #4
    Membre éprouvé Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Par défaut
    Tu dois cast ton object.
    Il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLASSE_OBJECT my_variable = (CLASSE_OBJECT)o;
    Ensuite tu auras accès aux méthode de CLASSE_OBJECT.
    Mais personnellement ta méthode est bizarre instancier une classe par son nom je pense que tu as un problème de conception parce ton code va etre dur à comprendre et corriger si tu continues comme ça à mon avis.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    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
    23
    24
    25
    26
    27
    28
    public static <T extends TonType> ArrayList<T> rechercheCollection(String arboresence,
    		Class<T>  typeObjet) {
     
    		String nom = typeObjet.getName();
    			try {
    				Class<T> cl = Class.forName(nom);
    					T o = cl.newInstance();
    					collecUnite.add(o);
    				}
    				return collecUnite;
     
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InstantiationException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
     
    			} catch (SecurityException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Petite question : pourquoi faire tout ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String nom = typeObjet.getName();
    Class<T> cl = Class.forName(nom);
    T o = cl.newInstance();
    En effet la variable "cl" est identique à "typeObjet".
    Pourquoi ne pas faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T o = typeObjet.newInstance();

    a++

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2008, 21h51
  2. Réponses: 1
    Dernier message: 04/06/2007, 10h23
  3. Réponses: 6
    Dernier message: 24/01/2007, 10h29
  4. Instanciation de class en dynamique
    Par Sakapatate dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2006, 15h45
  5. Réponses: 1
    Dernier message: 01/12/2005, 11h35

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