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 :

[reflection] Comment utiliser la reflection avec une table ?


Sujet :

Java

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [reflection] Comment utiliser la reflection avec une table ?
    Je n'arrive pas à utiliser la reflection dans mon programme.

    Je vous expose la situation :

    J'ai un fichier XML contenant un texte spécifique, par example "BOEventTypeEnum". Il s'agit du nom d'une interface. Dans mon programme, je souhaiterai évoquer la table String[] valuesText qui est contenue dans l'interface "BOEventTypeEnum" pour connaître sa taille et tous ses éléments.

    En temps normal, j'aurai simplement écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int keyId=0; keyId < BOEventTypeEnum.valuesText.length;keyId++)	
    {
    	helperDef.put(new Integer(keyId),BOEventTypeEnum.valuesText[keyId]);
     
    }
    Mais puisque le texte BOEventTypeEnum sera lue dans le fichier XML, il faudra que j'arrive à évoquer la table lors de l'exécution. Il faudra en gros parvenir à faire quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int keyId=0; keyId < LueDansLeXML.valuesText.length;keyId++)	
    {
    	helperDef.put(new Integer(keyId),LueDansLeXML.valuesText[keyId]);
     
    }

    Merci de votre aide,

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Je ne vois pas du tout le rapport entre ton problème et l'utilisation de la réflexivité en java...

    Concernant la lecture de ton fichier XML, tu utilises quelle API?
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par CyberChouan Voir le message
    Je ne vois pas du tout le rapport entre ton problème et l'utilisation de la réflexivité en java...
    je pense qu'il veut faire un Class.forName(...), mais je ne suis pas sûr.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    je pense qu'il veut faire un Class.forName(...), mais je ne suis pas sûr.
    Oui il faut utiliser l'API reflection, mais je ne suis pas parvenu à la faire fonctionner selon mes besoins.

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Pour ce besoin, tu vas avoir besoin du nom complet de la classe. Et comme tu ne pourras à priori pas le deviner (sauf à faire une recherche récursive par instrospection dans tout ton classpath... mais ça complique les choses), tu vas avoir besoin dans ton XML du nom de ta classe avec son package, du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.societe.package.souspackage.BOEventTypeEnum
    Ensuite, comme pseudocode te l'a indiqué, tu pourras accéder à ton objet "Class" à partir d'un "Class.forName(nom_complet_de_la_classe)"
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par CyberChouan Voir le message
    Pour ce besoin, tu vas avoir besoin du nom complet de la classe. Et comme tu ne pourras à priori pas le deviner (sauf à faire une recherche récursive par instrospection dans tout ton classpath... mais ça complique les choses), tu vas avoir besoin dans ton XML du nom de ta classe avec son package, du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.societe.package.souspackage.BOEventTypeEnum
    Ensuite, comme pseudocode te l'a indiqué, tu pourras accéder à ton objet "Class" à partir d'un "Class.forName(nom_complet_de_la_classe)"
    Merci, ce qui me bloque en faite c'est la suite. Comment parvenir à lire le tableau contenu dans cet objet Class ? BOEventTypeEnum contient un tableau de string et j'aimerai bien accéder à sa taille et à tous ses éléments.

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par leraptor Voir le message
    Merci, ce qui me bloque en faite c'est la suite. Comment parvenir à lire le tableau contenu dans cet objet Class ? BOEventTypeEnum contient un tableau de string et j'aimerai bien accéder à sa taille et à tous ses éléments.
    Tu peux créer une interface commune a tous tes xxxxTypeEnum, et caster le retour du Class.forName() dans cette interface.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    interface ITypeEnum {
    	String[] getArray();
    }
     
    class BOEventTypeEnum implements ITypeEnum {
    	public String[] getArray() { /* ... */ }
    }
     
    class OtherKindTypeEnum implements ITypeEnum {
    	public String[] getArray() { /* ... */ }
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Class<ITypeEnum> c = (Class<ITypeEnum>) Class.forName("org.societe.package.souspackage.BOEventTypeEnum");
    String[] array = c.newInstance().getArray();
     
    for (int keyId=0; keyId < array.length;keyId++)	{
    	helperDef.put(new Integer(keyId),array[keyId]);
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Tu peux créer une interface commune a tous tes xxxxTypeEnum, et caster le retour du Class.forName() dans cette interface.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    interface ITypeEnum {
    	String[] getArray();
    }
     
    class BOEventTypeEnum implements ITypeEnum {
    	public String[] getArray() { /* ... */ }
    }
     
    class OtherKindTypeEnum implements ITypeEnum {
    	public String[] getArray() { /* ... */ }
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Class<ITypeEnum> c = (Class<ITypeEnum>) Class.forName("org.societe.package.souspackage.BOEventTypeEnum");
    String[] array = c.newInstance().getArray();
     
    for (int keyId=0; keyId < array.length;keyId++)	{
    	helperDef.put(new Integer(keyId),array[keyId]);
    }
    Merci, mais ce n'est pas tellemnt envisageable de créer une interface par typeenum. J'avais pensé à utiliser un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Class<?> c = book.getClass();
     
     
    Field chap = c.getDeclaredField("valueText");
    Je vais essayer ça et je vous tiens au courant. Mais si vous avez d'autres pistes, n'hésitez pas!

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voici le code final qui fonctionne :
    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
    Object obj;
    				field = new BasicChoice();
    				BasicChoice helper = (BasicChoice) (field);
    				helper.setName(fieldName);
    				helper.setLabel(fieldLabel);
    				Map helperDef = helper.getDefinition();
     
    				try {
     
    					Class aClass = Class.forName("com.rfs.kdb.choice."+entityName);
     
    					Logger.getLogger(BatchCfgMaskImpl.class).fatal(
    							"Class : "+entityName);
     
    					String result = null;
    					try {
    					Field valuesArray = aClass.getDeclaredField("valuesText");
    					Logger.getLogger(BatchCfgMaskImpl.class).fatal(valuesArray.getType());
    					obj = valuesArray.get(null);
     
     
    					if(obj instanceof String[])logger_.fatal("String Type");
     
     
    				   // obj = valuesArray.get(null);
     
    					for (int keyId=0; keyId < Array.getLength(obj);keyId++)
     
    					{
    					helperDef.put(new Integer(keyId),Array.get(obj, keyId));
    					Logger.getLogger(BatchCfgMaskImpl.class).fatal(
    					"ValuesText : "+keyId+"and contains"+Array.get(obj, keyId));
    					}
     
     
     
     
    					}catch (NoSuchFieldException e) {
    						logger_.fatal("Non existing field");;
    				    } catch (IllegalAccessException e) {
    						logger_.fatal("IllegalAccessException");;
    				    } 
    					} catch (ClassNotFoundException ex) {
    				  // handle exception case
    					Logger.getLogger(BatchCfgMaskImpl.class).fatal(
    							"NotFound : "+entityName);
    				}
    Merci de votre aide!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2009, 09h35
  2. Utilisation de TdbLookUpCombo avec une table TAdoTable
    Par gilardino dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/08/2008, 11h00
  3. [XSLT]comment utiliser xsl:if avec une variable
    Par dbill dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/08/2007, 13h23
  4. Comment utiliser un BLOB avec une table ACCESS ?
    Par colorid dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/07/2007, 18h46
  5. Réponses: 1
    Dernier message: 04/05/2006, 10h45

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