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éflexion et tableau d'objets


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut Réflexion et tableau d'objets
    Bonjour,

    Je travaille sur une application serveur/client, et utilise la réflexion pour appeler depuis le client des méthodes sur mes objets java.

    Auparavant pour accéder à mes objets, je procédais ainsi :

    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
     
    public Dialing_program dialing_program_1;
    public Dialing_program dialing_program_2;
    public Dialing_program dialing_program_3;
     
    monitor_1 = new Monitor(scope, (short) 1);
    monitor_2 = new Monitor(scope, (short) 2);
    monitor_3 = new Monitor(scope, (short) 3);
     
    // etc, autres objets divers
     
    public boolean doCommand(Object[] params) throws Exception
    	{
    		// Copie dans un tableau les paramètres à transmettre
    		Object[] args = new Object[params.length-2];
    		for (short i = 0; i < args.length; i++)
    			args[i] = params[i+2];
     
    		String object = params[0].toString();
    		if (params[1] != null) object += "_"+params[1].toString();
    		ICommand command = (ICommand) this.getClass().getField(object).get(this);
    		command.doCommand(args);
     
    		return true;
    	}
    Où param[0] représente le type d'objet, param[1] le l'ID, et le reste est transmis en tant que paramètres à la méthode correspondante de l'objet. ICommand me sert à parer aux problèmes de casting.

    Donc ceci fonctionne très bien, mais arrive le moment où mon programme comporte de plus en plus d'objets, et de type différents, et que je dois logiquement ranger dans des tableaux. Ce qui donne pour reprendre l'exmple précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public Monitor monitor[] = new Monitor[3];
    	public Dialing_program dialing_program[] = new Dialing_program[3];
    Et là, je ne sais pas comment accéder à mes objets ! La reflexion me renvoyant le tableau, mais ne me permettant pas de renvoyer les objets contenus dans ses cellules. Si je n'avais qu'un type d'objet, je pourrais copier cet élément pour y accéder : Object[] arr = this.getClass().getField(params[1].toString()).get(this);
    Mais j'ai plusieurs types d'objets !

    Voici que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public boolean doCommand(Object[] params) throws Exception
    	{
    		// Copie dans un tableau les paramètres à transmettre
    		Object[] args = new Object[params.length-2];
    		for (short i = 0; i < args.length; i++)
    			args[i] = params[i+2];
     
    		ArrayList list = (ArrayList) this.getClass().getField(params[0].toString()).get(this);
    		ICommand command = (ICommand) list.get(0);
    		command.doCommand(args);
     
    		return true;
    	}
    Mais ça ne fonctionne pas. Cela fait un moment que je bloque, c'est pourquoi je sollicite votre aide pour trouver la solution !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    je ne suis pas sur de tout comprendre mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getClass().getField(params[0].toString())
    devrait te renvoyer un tableau non ?

    Quel sont les types d'object qu'il peut y avoir dans ton tableau ?

    Uniquement des ICommand ?
    Pourquoi ne pas utiliser params[1] pour connaitre la commande ?

    Car params[1] contient l'id de la commande, non ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Merci de te pencher sur mon cas

    Citation Envoyé par elmor Voir le message
    je ne suis pas sur de tout comprendre mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getClass().getField(params[0].toString())
    devrait te renvoyer un tableau non ?
    En effet.

    Citation Envoyé par elmor Voir le message
    Quel sont les types d'object qu'il peut y avoir dans ton tableau ?
    Il y a de nombreux types d'objets. J'ai mis à titre d'exemple Monitor et Dialing_program.

    Citation Envoyé par elmor Voir le message
    Uniquement des ICommand ?
    ICommand est une interface déclarée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface ICommand
    {
    	public void doCommand(Object[] params) throws Exception;
    }
    Citation Envoyé par elmor Voir le message
    Pourquoi ne pas utiliser params[1] pour connaitre la commande ? Car params[1] contient l'id de la commande, non ?
    Attention, je ne cherche pas à connaître le nom de la commande (celle-ci sera toujours doCommand), mon problème est que je n'arrive pas à pointer sur l'objet contenu dans le tableau.
    params[1] contient le numéro de la cellule du tableau, en fait (désolé si je me suis mal exprimé).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    En fait si tous tes objects implementent l'interface ICommand

    Un code de ce genre devrait fonctionner non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Object[] args = new Object[params.length-2];
    for (short i = 0; i < args.length; i++)
    	args[i] = params[i+2];
     
            ICommand[] commands =( ICommand[])this.getClass().getField(params[0].toString()).get(this);
     
            int commandIndex = Integer.parseInt(params[1]);
            ICommand command = commands  [commandIndex];
    	command.doCommand(args);
     
    		return true;
    Si ça ne fonctionne pas peux tu envoyer l'erreur retournée ?


    Si la méthode this.getClass().getField(params[0].toString()) peut retourner un tableau ou un IComand simple alors si suffit de faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Object object =this.getClass().getField(params[0].toString()).get(this);
    if (object== null){
    //Erreur possible ??
    } 
     ICommand[] commands =null;
     int commandIndex = Integer.parseInt(params[1]);
    if (object.getClass().getComponentType()!=null){
     ICommand[] commands =( ICommand[])object;
    }else{
    commands= new Commands[]{(ICommand)object};
    commandIndex =0;
    }
    ...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Merci infiniment elmor
    Je ne sais pas comment j'ai pu me heurter à un tel problème avec une solution aussi simple Je débute avec les interfaces...

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

Discussions similaires

  1. retour tableau d'objets par service web axis jboss
    Par TrollMaster dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/11/2005, 21h45
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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