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

Langage Java Discussion :

Traitement indépendemment de l'instance


Sujet :

Langage Java

  1. #1
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut Traitement indépendemment de l'instance
    Bonjour

    voici mon problème qui est en somme toute bête mais là je ne vois pas la solution:
    j'ai un objet (org.apache.xmlbeans.XmlObject) que je reçois en paramètre d'une méthode. Cet objet peut être une instance de plusieurs classes (potentiellement une dizaine de classes)
    J'aimerai appliquer un traitement à cet objet qui doit être le même quelque soit l'instance de la classe.
    Mais j'aimerais éviter quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (myObject instanceof Classe1){
        //traitement sur mon objet;
    }else if myObject instanceof Classe2){
        // //traitement sur mon objet;
    }
    les traitements sont les mêmes car en fait je caste l'objet dans la bonne classe et une fois que c'est fait le traitement est redondant
    Est-ce que quelqu'un aurait une idée ?
    merci

    PS: version JRE 1.5

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public typeRetour traitement(XmlObject xmlObject){
      //les traitements ici
    }
    A+.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Tu le caste dans la classe / interface commune à tous ces objets et tu utilise les méthodes sur cette interface. Je suppose dans ton cas, mais sans être certain, que c'est le type XmlAnySimpleType que tu cherche.

  4. #4
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    Tout d'abord merci à tous les deux
    Finalement je n'ai pas le choix, car l'interface commune à mes sous classes et XmlObject et forcément celle-ci n' pas les méthodes fonctionnelles de mes sous classes

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par défaut
    Bonjour,

    Ce que tu souhaites faire est possible. Il suffit que tu utilises l'introspection.
    Je te conseil de lire ceci

    Un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Object o = new Point();
    		Class classO = o.getClass();
     
    		try{
    			Method m1 = classO.getMethod("setX", Double.TYPE);
    			m1.invoke(o, new Double(45));
    			System.out.println(((Point)o).getX());
     
    		}catch(Exception e){
    			System.out.println("Erreur...");
    		}
    Dans l'exemple, à partir d'un Object (de type Point) on appel la méthode setX(int x) sans faire de transtypage.

  6. #6
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    Bonjour

    merci Romano; ce que tu m'as donné m'a bien aidé et j'ai pu factorisé une grande partie de mon code
    Par contre je reste coincé sur un problème
    En invoquant une méthode je trouve une liste d'objet dont je ne connais pas la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     Class[] paramTypes = null;
     Object[] args  = null;
     Method methode1 = myObject.getClass().getMethod("maMethodeXXXX",paramTypes);
     
      Object object1 =  methode1.invoke(myObject, args);
       Method methode2 = object1.getClass().getMethod("getXXXArray",paramTypes);
     
      Object objet2 = methode2.invoke( object1, args);
       List<?> liste = new ArrayList(Arrays.asList(objet2));
        Iterator<?> iterator = liste .iterator();
    //PS: pour simplifier j'ai supprimé les try catch
    L'appel à la méthode 2 renvois un array d'objet c'est pour cela que je peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     List<?> liste = new ArrayList(Arrays.asList(objet2));
    Mon point de blocage est lorsque je veux parcourir ma liste et que je veux appeler une méthode sur l'objet récupérer dans mon iterator

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     while (iterator.hasNext()) {
         Object current = iterator.next();
         Method  methode3= current .getClass().getMethod("getYYYY",paramTypes);
    }
    Et j'ai une belle exception :
    java.lang.NoSuchMethodException : nom de la classe
    Et pourtant la méthode existe bien pour la classe de mon objet current
    Je sais que les types génériques ne sont pas récupérées durant le runtime et je crois que le problème vient de là.
    Si vous avez une idée je suis preneur. Merci encore

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Je dois dire que ce code est particulièrement illisible et que tu gagnerais à avoir myObject qui implémente une interface particulière, pareil pour Object 1 et Object 3, tu pourais alors avoir un truc du genre beaucoup plus facile à lire et moins sujet aux erreurs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    InterfaceA myObject= ....
    InterfaceB object1 = myObject.maMethodeXXXX();
    InterfaceC[] object2 = object1.getXXXArray();
    List<InterfaceC> liste = new ArrayList(Arrays.asList(objet2));
    for (InterfaceC current : liste){
       current.getYYY();
    }
    Non, la généricité n'a rien à voir avec ton erreur. Tu tente d'appeler par reflection une méthode qui n'existe pas. Mais vu le code, impossible de dire ou est l'erreur, visiblement tu n'a pas les objets auxquels tu t'attends.

  8. #8
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    merci tchize et désolé pour la lisibilité mais j'essaie d’éviter de mettre des noms de classes clientes.
    Sinon je ne peux pas faire comme tu l'indiques car j'ai plusieurs interface qui porte le même nom et qui ne sont pas dans le même package.
    je ne peux pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    List<Interface> liste = ....
    Et quand j'ai l'exception la stack me donne le nom de l'interface et le nom de la méthode . j'obtiens bien les objets je m'attends.Quand je regarde le code de l'interface, la méthode y est bien

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    tu peux très bien utiliser plusieurs interface /classes de même nom dans des packages différents, suffit de mettre le le nom complet (List<com.company.BlaBla>) au lieu de faire un import com.company.BlaBla

  10. #10
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    mais mon problème est que je n'ai pas le nom du package

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    En gros t'as 15 interfaces identiques dans 15 packages différents et tu ne sais pas à l'avance de quel package ça viendra?
    J'aurais tendance à dire "refactoring" si il y a 15 interfaces identiques.

    Concernant ton message d'erreur, on ne peux pas être plus explicite: il n'y a pas de méthode au nom demandé dans l'instance que tu essaie d'utiliser. Tu peux utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Method m : current.getClass().getMethods()){
       System.out.println(m);
    }
    pour avoir la liste des méthodes disponibles.

  12. #12
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    tu as compris
    et j'ai bien évidemment pensé à faire lister le nom des méthodes et j'ai obtenu ceux de l'interface List, à savoir
    add
    add
    indexOf
    clone
    clear
    contains
    lastIndexOf
    addAll
    addAll
    get
    size
    toArray
    toArray
    remove
    remove
    isEmpty
    set
    ensureCapacity
    trimToSize
    hashCode
    equals
    iterator
    subList

    etc ...

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Donc tu travaille sur une List et pas sur l'objet auquel tu t'attendais.

  14. #14
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    c'est bien ça que je ne comprends pas
    Comment à partir du code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while (iterator.hasNext()) {      
    Object current = iterator.next();
          Method  methode3= current .getClass().getMethod("getYYYY",paramTypes); }
    mon objet current peut être une instance de List ?

    d'autant plus que lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("NAME:" + current.getClass().getName());
    j'obtiens bien le nom de l'interface que je recherche et dans le bon package
    Je vais relire la doc parce qu'il y a quelque chose qui m'échappe

  15. #15
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    dans la doc je trouve ceci
    http://docs.oracle.com/javase/tutori...ethodType.html


    The generic return type for the method Class.cast() is reported as java.lang.Object because generics are implemented via type erasure which removes all information regarding generic types during compilation.

  16. #16
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par noOneIsInnocent Voir le message
    c'est bien ça que je ne comprends pas
    Comment à partir du code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while (iterator.hasNext()) {      
    Object current = iterator.next();
          Method  methode3= current .getClass().getMethod("getYYYY",paramTypes); }
    mon objet current peut être une instance de List ?

    d'autant plus que lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("NAME:" + current.getClass().getName());
    j'obtiens bien le nom de l'interface que je recherche et dans le bon package
    Ce n'est pas possible, sauf si la classe concernée est aussi une List. Un de tes deux tests doit être erroné

    Soit tu as changé current en cours de route.
    Soit un de tes tests n'utilise pas current mais autre chose.

    Sans avoir le code exact que tu as utilisé, et la sortie exacte dans la console, difficile de t'en dire plus.

    Encore une vois les erasur et le generic ne sont pas concerné puisque, à aucun moment, tu ne demande à ta liste "tu stocke quel type", tu te content de sortir les objet de la liste pour ensuite les analyser. Ils ne changent pas de nature en rentrant dans la liste

  17. #17
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    Effectivement tu as raison
    je viens de comprendre mon problème, en me relisant et en me disant que puisque les méthodes sont celles de l'interface List je me suis demander où cela peut intervenir
    Le seul endroit possible est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Method methode2 = object1.getClass().getMethod("getXXXArray",paramTypes);  
    Object objet2 = methode2.invoke( object1, args); 
     List<?> liste = new ArrayList(Arrays.asList(objet2));   Iterator<?> iterator = liste .iterator();
    En invoquant ma méthode 2, j'obtiens en retour un array de Object et non pas un object tout court
    Et donc en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Method methode2 = object1.getClass().getMethod("getXXXArray",paramTypes);
    Object[] objet2 = methode2.invoke( object1, args); 
    List<?> liste = new ArrayList(Arrays.asList(objet2));
    Iterator<?> iterator = liste .iterator();
    j'obtiens le résultat souhaité
    Merci pour ton aide

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

Discussions similaires

  1. Timer: 1 ou 2 instances pour 2 traitements ?
    Par RudyWI dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 30/09/2011, 16h31
  2. Réponses: 0
    Dernier message: 24/11/2009, 12h36
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 11h47
  4. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 16h13
  5. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 10h44

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