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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é

    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

  8. #8
    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

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