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 :

Récuperation d'un élément du instance de classe Object


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    élève ingenieur
    Inscrit en
    Août 2015
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : élève ingenieur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2015
    Messages : 69
    Par défaut Récuperation d'un élément du instance de classe Object
    Bonjour,

    Je suis débutant en programmation en java.

    S'il vous plait , j'ai une attribut result du classe ObjectResult , qui est une instance du classe Object.Comme elle est une instance du classe object , elle peut étre un array, UNSIGNED, LONG_UNSIGNED ,STRUCT: c'est de l'héritage, tous hérite du classe Object donc array est un Object.

    le but est de récuperer les élements du l'attribut result du classe ObjectResult qui est une instance du classe Object.

    voici la classe ObjectResult
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class ObjectResult  {
     
    	/** The type. */
    	private Choices type;
     
    	/** The result. */
    	private Object result;
     
    	private TypeInterpretation interpretationOfType ;
    //getter setter et constructeur
    je sais qui est un peu flou mais l'idée est ceci : Comment récuperer un élément du instance de classe Object.

    car j'ai fait un petit test , après j'ai déboguée , l'attribut result du classe ObjectResult qui est une instance du classe Object est un arrayList qui contient plusieurs éléments. le but est de récupérer juste un de ses élements.

    Je vous donne des imprimes écrans afin de vous comprendre la situation et le probléme rencontré:
    Nom : result.png
Affichages : 292
Taille : 21,6 Ko

    l'image montre le type de l'attribut result(qui Object) mais ici c'est ArrayList<E>

    le but est de récuperer juste un de ses éléments:
    contenu de result
    Nom : contenu 1.png
Affichages : 330
Taille : 12,7 Ko

    le conteneu de élément Data
    Nom : contenu de result.png
Affichages : 398
Taille : 29,3 Ko
    on suppose qu'on veux récuperer [0] qui est de type ResultData.

    voici la classe ResultData

    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
     
    public class ResultData  {
     
    	/** The result. */
    	private ObjectResult result;
     
    	/** The obis. */
    	private String obis;
     
    	/** The class id. */
    	private String classId;
     
    	/** The attribute id. */
    	private String attributeId;
     
    	/** The data index. */
    	private String dataIndex;
     
    	/** The version. */
    	private String version;
     
    	private Data data;
     
    //setters getters constructeur
    contenu de l'element [0] de type ResultData
    Nom : contenu de [0].png
Affichages : 317
Taille : 16,9 Ko

    ainsi sous une seule image
    Nom : globale.png
Affichages : 290
Taille : 21,6 Ko


    j'ai essayer mais je n'ai pas trouvé la solution , je suis bloqué depuis une semaine.

    j'espére qu vous avez compris le probléme.

    j'ai essayé de recuperer les élements de attribut result (instance de classe Object) mais les méthodes qu je peux utiliser sont juste celle offerte pour la classe Object qui sont par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     hashashCode(); wait(); notifyAll(); equals(obj)
    bref celle offerte pour la classe Object.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ob.getResult().hashCode();
    J'ai pensé a cast mais il m'interdit : java.lang.ClassCastException: java.util.ArrayList cannot be cast to parse.ObjectResult
    Merci.

  2. #2
    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,


    Citation Envoyé par enadams Voir le message
    J'ai pensé a cast mais il m'interdit : java.lang.ClassCastException: java.util.ArrayList cannot be cast to parse.ObjectResult
    Il faut bien casté... mais dans le bon type (ce qui ne semble pas être le cas ici vu le message d'erreur).



    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    élève ingenieur
    Inscrit en
    Août 2015
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : élève ingenieur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2015
    Messages : 69
    Par défaut
    Bonjour,

    merci pour vos réponse , mais je n'ai pas trouvé la solution c-a-d le bon cast.

    En effet, le but est d'interpreter un objet de type ResultData. Comment?

    Chaque objet de type ResultData est associé a un fichier xml qui possède l'interprétation de ses donnés.
    par exemple, dans l'exemple precedente, array possede son interprétation dans le fichier XML comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <array name="object_list" min="0" max="9999">
    .
    Le but est de récuperer cette interpretation est de stocker dans l'attribut interpretationOfType (instance du classe TypeInterpretation) du classe ObjectResult.

    voici la declaration du TypeInterpretation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class TypeInterpretation {
     
    	private String nameOfType ;
    	private int nbrOfAttributes;
    	private Map<String,String>  attributes = new HashMap<>();
     
    //getters , setters , constructeurs
    ainsi l'attribut interpretationOfType possédera l'interpretation de type Array comme ceci :
    nameOfType = array
    nbrOfAttributes = 3(name,min,max)
    attributes qui est une map et qui porte l'attribut et sa valeur.

    j'ai pensé de faire une méthode qui prend une instance de ObjectResult comme parametre , l'associer a sa fichier xml , recuperer sa interpretation et le stocker dans l'attribut interpretationOfType du objet passé en parametre. J'ai utilisé l'API Stax afin de parcourir le fichier xml. D'abord elle va chercher la position afin de commencer de récuperer les données de fichiers XML qui sera la valeur de l'attribut interpretationOfType de l'objet passé en parametre et sera en parallele avec parcours de l'objet passé en parametre.

    voici la méthode ObjectInterpretation du classe DataInterpretation qui prend l'objet ObjectResult comme parametre et modifie son attribut interpretationOfType afin de l'interpreter en parcourant sa fichier XML.
    c-a-d cette méthode parcourt en meme temps le fichier XML et l'objet passé en parametre et modifier son attribut interpretationOfType.

    Donc cette méthode est récursive.

    elle interpréte l'objet passé en parametre ainsi son attribut result de type Object .

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public class DataInterpretation  {
     
     
     
     
    	public static ObjectResult objectInterpretation(ObjectResult ob)
    	{
    		XMLInputFactory factory = XMLInputFactory.newInstance();
    		 File file = new File("test1.xml");
    		 Boolean found=false ;
    		 try {
    			 XMLStreamReader reader = factory.createXMLStreamReader(new FileReader(file));
    			 while (reader.hasNext() && !found) {
    				 int type = reader.next();
    				 if(type== XMLStreamReader.START_ELEMENT && reader.getLocalName().equals("attribute") && reader.getAttributeName(0).toString().equals("id") && reader.getAttributeValue(0).equals("2")) 
    				 {
    					 found=true ;
    					 Boolean foundFinish =false;
    					 while (reader.hasNext() && !foundFinish)
    					 {
    						 type = reader.next();
    						 if(type==XMLStreamReader.START_ELEMENT)
    						 {
    							 if(!reader.getLocalName().equals("dlmsAttribute")&&!reader.getLocalName().equals("association"))
    							 {
    								 String name = reader.getLocalName();
    								 int nbrOfAtt = reader.getAttributeCount();
    								 Map<String,String>  attri = new HashMap<>(nbrOfAtt);
    								 for(int i = 0; i < reader.getAttributeCount(); i++)
    				                  {
    				                	 attri.put(reader.getAttributeName(i).toString(), reader.getAttributeValue(i)) ;
    				                  }
    								 TypeInterpretation obInter = new TypeInterpretation(name, nbrOfAtt, attri);
    								 ob.setInterpretationOfType(obInter);
    								objectInterpretation( (ObjectResult) ob.getResult());
     
     
    							 }
    						 }
    						 else if(type==XMLStreamReader.END_ELEMENT && reader.getLocalName().equals("attribute"))
    						 {
    							 foundFinish=true;
    						 }
    					 }
    				 }
    			 }
     
    		 }catch (FileNotFoundException e) {
    	         e.printStackTrace();
    	      } catch (XMLStreamException e) {
    	         e.printStackTrace();
    	      }
    		 return ob;
     
    	}
    }

    Le probléme ici est que la classe Object ne peut pas étre casté en ObjectResult. C'est pourquoi j'ai pensé de récupérer l'element sous l'objet result (attribut de classe ObjectResult) attribut de l'objet passé en parametre qui peut etre un arrayList de ResultData ainsi le passé en parametre pour la récursivité.

    @ Nico02 , oui elle peut etre de n'importe quel type , elle peut etre liste ou type primitive comme LONG_UNSIGNED.

    Je pense que selon son type (avec la methode ) je fais des traitements afin de ne pas implementer.

    Merci d'avance et désolé pour le retard

  4. #4
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Ok je comprends mieux.

    Par contre tu essais un peu de ré-inventer la roue là

    Il existe des librairies capable de générer des classes Java en fonction d'un fichier XML, ou encore de parcourir un fichier XML et de créer les objets automatiquement (à l'aide d'annotations ou d'un fichier XSD).

    Je te laisse regarder du coté de JAXB qui fait exactement ce que tu veux.

  5. #5
    Membre confirmé
    Homme Profil pro
    élève ingenieur
    Inscrit en
    Août 2015
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : élève ingenieur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2015
    Messages : 69
    Par défaut
    Merci beaucoup
    Nico02
    pour votre réponse.

    Je vais essayé cette API .

  6. #6
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Salut,

    Comment est-ce que tu remplis cette variable result ? Qui construit cette liste avec les données qu'elle contient ? Est-ce que ce sera toujours une liste (car tu dis que ça peut être de n'importe quel type) ?

    Tu dis que tu as choisis d'utiliser la classe Object car le résultat peut être de n'importe quel type, or si c'est vraiment le cas ça ne sert à rien de chercher la structure et de caster ton objet car dès que le type de résultat va changer, ton code va planter.

    Donc avant d'aller plus loin il va falloir que tu précises les points que j'ai évoqué plus haut et de là on verra ce qui est le plus adapté.

    Cdt.

    ps: ici ton résultat ne contient pas de liste, il contient un objet de type ObjectResult qui lui contient la liste dans sa variable résultat. Donc normal que ton cast plante.

  7. #7
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Si possible, utilise le polymorphisme, c'est-à-dire n'utilise pas Object mais un supertype commun à toutes tes instances.
    Si tu ne peux pas changer le type de ton attribut (cf: Object), tu n'as pas d'autre choix que d'utiliser la Reflection.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

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

Discussions similaires

  1. Supprimer une instance de classe à partir d'un élément de l'instance
    Par SandyF dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 05/10/2010, 17h09
  2. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  3. Instance de classes
    Par KymZen dans le forum Tkinter
    Réponses: 9
    Dernier message: 07/04/2005, 08h35
  4. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16
  5. Réponses: 5
    Dernier message: 24/04/2003, 11h47

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