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

API standards et tierces Java Discussion :

Reflection et type primitif


Sujet :

API standards et tierces Java

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut Reflection et type primitif
    Bonjour,

    La situation est la suivante:

    J'ai un objet Methode, à partir de celui-ci, je récupère sa liste d'arguments. Elle contient toujours qu'un seul argument dans ma situation, et cet argument et le plus souvent un type primitif, mais pas toujours...

    Je souhaite faire un invoke de cette méthode. Le souci est que l'invoke prend la liste d'argument sous la forme d'un tableau d'Object. Et à ce niveau là, la seul info que j'ai sur l'argument est son type donné par sa liste d'argument.

    La question est: Comment je peut instancier un Object à partir du type primitif.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Methode m;
    Class[] parameterType = m.getParameterTypes();
    // parameterType[0] est un type primitif mais je ne sais pas lequel
    //....
    //Je dois arriver à la ligne ci dessous
    m.invoke(myObject,arg);
    // myObject est l'objet sur lequel je fait l'invoke. arg est un Object[]
    Je ne sais pas si je suis assez clair, le cas échéant je repondrais à vos questions

    Merci pour votre aide...

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Utilises les classer Wrapper comme Integer, Double, Char, Float, Byte & cie....

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par sinok
    Utilises les classer Wrapper comme Integer, Double, Char, Float, Byte & cie....
    Oui je sais bien qu'il faut utiliser un wrapper. La question est comment. Car tout ce que j'ai c'est un objet Class. Comment, de l'objet Class, je peux remonter au wrapper.

    Il y a bien la solution d'un test sur Double.TYPE, Integer.TYPE... Mais je cherche à le faire de façon générique, donc sans une suite de tests sur les 8 types primitifs. J'ai cherché, mais je n'ai rien trouvé. Peut être qu'il n'y a pas de solutions. Mais si quelqu'un a une idée, cela m'interesse.

    Merci

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peux utiliser une Map, 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
    14
    15
    16
    17
    18
    static final private Map<String, Class> wrappers = new Hashtable<String, Class>();
     
        static {
            wrappers.put("void", java.lang.Void.class);
            wrappers.put("boolean", java.lang.Boolean.class);
            wrappers.put("char", java.lang.Character.class);
            wrappers.put("byte", java.lang.Byte.class);
            wrappers.put("short", java.lang.Short.class);
            wrappers.put("int", java.lang.Integer.class);
            wrappers.put("long", java.lang.Long.class);
            wrappers.put("float", java.lang.Float.class);
            wrappers.put("double", java.lang.Double.class);
        }
     
        public static final Class getWrapper(Class<?> primitive) {
            Class wrapper = wrappers.get(primitive.getName());
            return (wrapper == null) ? primitive : wrapper;
        }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par le y@m's
    Tu peux utiliser une Map, 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
    14
    15
    16
    17
    18
    static final private Map<String, Class> wrappers = new Hashtable<String, Class>();
     
        static {
            wrappers.put("void", java.lang.Void.class);
            wrappers.put("boolean", java.lang.Boolean.class);
            wrappers.put("char", java.lang.Character.class);
            wrappers.put("byte", java.lang.Byte.class);
            wrappers.put("short", java.lang.Short.class);
            wrappers.put("int", java.lang.Integer.class);
            wrappers.put("long", java.lang.Long.class);
            wrappers.put("float", java.lang.Float.class);
            wrappers.put("double", java.lang.Double.class);
        }
     
        public static final Class getWrapper(Class<?> primitive) {
            Class wrapper = wrappers.get(primitive.getName());
            return (wrapper == null) ? primitive : wrapper;
        }
    Oui aussi, mais ce n'est pas plus générique que des testes if/else if/...
    Cela dépend de notre implémentation.
    Non mais je pense que dans l'API JAVA, il n'y a rien qui permette de faire ce que je souhaite. Donc tant pis, je vais tester un a un les 8 types primitifs et construire l'Object qui va bien...

    Sinon une bierre à celui qui connais la solution

  6. #6
    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 : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Les types non primitifs connaissent la "classe" de leurs types primitifs associés, sous la forme de variables statiques.

    Regarde par exemple:
    Integer.TYPE;
    Long.TYPE;
    etc.

    A partir de ces types et d'un wrapper, tu peux créer un méthode qui te trouve la bonne méthode par réflexion, en testant les différentes possibilités.

    Ensuite, pour l'invocation de ta méthode, la méthode "invoke()" fera le cast toute seule, que tu lui passes le type primitif ou le type objet associé.
    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

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par CyberChouan
    Les types non primitifs connaissent la "classe" de leurs types primitifs associés, sous la forme de variables statiques.

    Regarde par exemple:
    Integer.TYPE;
    Long.TYPE;
    etc.

    A partir de ces types et d'un wrapper, tu peux créer un méthode qui te trouve la bonne méthode par réflexion, en testant les différentes possibilités.

    Ensuite, pour l'invocation de ta méthode, la méthode "invoke()" fera le cast toute seule, que tu lui passes le type primitif ou le type objet associé.
    C'est ce que j'ai fait. Mais c'est la suite de test que je souhaitais eviter.

  8. #8
    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 : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Tu peux utiliser l'API de Jakarta "BeanUtils". Elle te fournira les méthodes que tu veux directement.

    Cependant, cela ne fait que masquer le problème... en interne, les tests seront bien effectués par les méthodes de Jakarta, mais de manière transparente pour toi.
    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

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Oki merci. Donc le problème n'est pas solvable
    C'est quand même curieux que JAVA ne prevoit pas ça étant donné que Methode.invoke ne supporte pas le passage d'un type primitif en argument...

    Enfin bon, voilà ce que j'avais fait avec des tests:

    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
     
        if(parameterType[0].isPrimitive()) {
          // If type is a primitive type, we search wich object is relative to this 
          // type
          if(parameterType[0].equals(Short.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct Short object.");
            arg = new Short(Short.parseShort(argToParse));
          }
          else if(parameterType[0].equals(Integer.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct  Integer object.");
            arg = new Integer(Integer.parseInt(argToParse));
          }
          else if(parameterType[0].equals(Long.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct  Long object.");
            arg = new Long(Long.parseLong(argToParse));
          }
          else if(parameterType[0].equals(Float.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct Float  object.");
            arg = new Float(Float.parseFloat(argToParse));
          }
          else if(parameterType[0].equals(Double.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct  Double object.");
            arg = new Double(Double.parseDouble(argToParse));
          }
          else if(parameterType[0].equals(Boolean.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct  Boolean object.");
            arg = Boolean.valueOf(argToParse);
          }
          else if(parameterType[0].equals(Character.TYPE)) {
            if(log.isDebugEnabled())
              log.debug("Construct Character object.");
            arg = new Character(argToParse.charAt(0));
          }
        }
        else {
          // If its not a primitive type, we construct an object using a string
          // argument
          if(log.isDebugEnabled())
            log.debug("Construct "+parameterType[0].getName()+" object.");
          Class[] stringClass = {String.class};
          Object[] argTab = {argToParse};
          arg = (parameterType[0].getConstructor(stringClass)).newInstance(argTab);
        }
    Merci pour votre aide

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Autant n'utiliser que des wrapper, et l'autoboxing java 1.5 en cas de grande nécessité...

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par sinok
    Autant n'utiliser que des wrapper,
    Tu veux dire en général? Lorsqu'on code?

    Citation Envoyé par sinok
    et l'autoboxing java 1.5 en cas de grande nécessité...
    Je suis restreint à utiliser JAVA 1.4

  12. #12
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par Buendon
    Tu veux dire en général? Lorsqu'on code?
    Autant que possible, enfin pour le compteurs de boucle non, c'est évident, maispour des réultats ou des valeurs sur lesquelles tu feras peu de calculs.

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par sinok
    Autant que possible, enfin pour le compteurs de boucle non, c'est évident, maispour des réultats ou des valeurs sur lesquelles tu feras peu de calculs.
    Oui, mais il ne faut pas oublier que les types primitifs sont aussi fait pour optimiser et éviter de créer un objet justement.

  14. #14
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut
    Citation Envoyé par le y@m's Voir le message
    Tu peux utiliser une Map, 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
    14
    15
    16
    17
    18
    static final private Map<String, Class> wrappers = new Hashtable<String, Class>();
     
        static {
            wrappers.put("void", java.lang.Void.class);
            wrappers.put("boolean", java.lang.Boolean.class);
            wrappers.put("char", java.lang.Character.class);
            wrappers.put("byte", java.lang.Byte.class);
            wrappers.put("short", java.lang.Short.class);
            wrappers.put("int", java.lang.Integer.class);
            wrappers.put("long", java.lang.Long.class);
            wrappers.put("float", java.lang.Float.class);
            wrappers.put("double", java.lang.Double.class);
        }
     
        public static final Class getWrapper(Class<?> primitive) {
            Class wrapper = wrappers.get(primitive.getName());
            return (wrapper == null) ? primitive : wrapper;
        }
    STP peux-tu me dire exactement comment je peux utiliser cette Map ?
    J'aimerai bien l'utiliser.
    Quelqu'un a-t-il eu une idée entre temps sur l'utilisation des types non primitifs ?

    Merci

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Citation Envoyé par zsoh Voir le message
    STP peux-tu me dire exactement comment je peux utiliser cette Map ?
    J'aimerai bien l'utiliser.
    Quelqu'un a-t-il eu une idée entre temps sur l'utilisation des types non primitifs ?

    Merci
    Heu, tu peux préciser un peu plus ton problème, car je ne vois pas trop ce que tu ne comprend pas en fait... Du coup, je ne sais pas quoi te répondre

  16. #16
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut
    Je veux juste savoir où est-ce que cette Map doit être déclarée (dans une classe, ..??) et comment l'utiliser par exemple. Un exemple de bout de code si possible pour son utilisation.

    Merci

  17. #17
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tout mon code doit effectivement se trouver dans une classe. Tu trouveras un exemple d'utilisation ici .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. Reflect JAVA: Connaître dynamiquement le type primitif associé
    Par TravelMate dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 08/08/2006, 23h07
  2. Réponses: 11
    Dernier message: 21/05/2006, 14h39
  3. Réponses: 3
    Dernier message: 07/02/2006, 22h18
  4. [info] passer d'un type primitif a String
    Par soad dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2005, 13h19
  5. [prog dynamique]Constructeur avec type primitif
    Par -=Spoon=- dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2004, 10h33

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