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 :

[reflexivité] instancier un 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 éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut [reflexivité] instancier un type primitif ?
    Bonjour, j'ai un petit souci avec la reflexivité.
    Je dois appeler des méthodes dont je ne connais pas le type des paramètres.
    Pour retrouver ces types, j'utilise la méthode getParameterTypes() de la classe Method.

    Seulement, comme je travaille à partir d'un main, mes arguments sont des String, je veux donc convertir mes arguments dans le bon type pour pouvoir appeler ma méthode.

    Avec les types non primitifs pas de problème, mais pour les types primitifs je n'y arrive pas. Voilà un morceau de mon code pour aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Class[] params = m.getParameterTypes();
                    Object[] os = new Object[params.length];
                    Constructor construct;
                    for(i = 0; i < params.length; i++){
                        construct = params[i].getConstructor(new Class[]{String.class});
                        os[i] = construct.newInstance(new String[]{args[i]});
                    }
    En fait la méthode que je teste à 4 paramètres, 3 String et un int.
    Pour les String, je récupère le constructeur sans problème puisque String est un Object, par contre pour le int pas moyen.

    Je voudrais donc savoir comment passer d'un Class = int à un Class = Integer automatiquement car int n'est pas le seul type primitif existant !

    Merci d'avance

  2. #2
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    Citation Envoyé par xblond
    Je voudrais donc savoir comment passer d'un Class = int à un Class = Integer automatiquement car int n'est pas le seul type primitif existant !
    A ma connaissance, ça n'existe pas (automatiquement) : par contre ce n'est pas long à faire sur TOUS les primitifs.

  3. #3
    Invité de passage
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1
    Par défaut
    De mon coté, j'utilise la methode valueOf commune aux types primitifs pour faire la conversion primitif vers object. Mais je le peux car j'ai ma valeur est recu en amont par String.

    Si ca peut t'aider:

    Class[] proto = {Class.forName("java.lang.String")} ;
    Method parse = Class.forName( type ).getMethod("valueOf", proto ) ;
    value = parse.invoke( null, valueAsStr ) ;

    Apres, je ne sais pas d'où vient l'origine de la valeur de la variable de ton type primitif mais il existe des methodes appliquant automatiquement du wrapping comme:
    - getComponentType() via la class d'un tableau ou directement get ou set sur un tableau donc possible si tu travailles sur un tableau (de taille 1?) ;
    - la classe Field si tu travailles sur des attribus
    - ...

    Essaye de voir si une de ces methodes correspond à la source de ta donnée

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Si j'ai bien compris quand tu as un type int tu ne sais pas comment le mettre dans le tableau de parametres que tu passes a ta fonction c'est ca ?

    Tu ne peux pas faire ca facilement avec le constructeur malheureusement.

    Pour un int il faut un Integer dans le tableau d'objet que tu passes pour les arguments.

    Tu vas devoir faire un if (Integer.TYPE.equals(params[i])) ... et ainsi de suite pour chaque type primitif et dans chaque cas tu utilises le wrapper correspondant.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut
    Il n'y a donc pas de méthode permettant de dire si j'ai un Integer.TYPE alors je veux la classe Integer ?

    Ca m'ennuie un peu de faire un bloc de if else if ...

    Il n'existe pas au moins un moyen de faire ca avec un switch ?

    Merci

  6. #6
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par xblond
    Il n'y a donc pas de méthode permettant de dire si j'ai un Integer.TYPE alors je veux la classe Integer ?

    Ca m'ennuie un peu de faire un bloc de if else if ...

    Il n'existe pas au moins un moyen de faire ca avec un switch ?

    Merci
    Le switch ne marche qu'avec les types primitif malheureusement .. c'est le comble de ne pouvoir en faire un pour tester les Classes des types primitifs mais c'est comme ca

    Une solution pour limiter le code mais perdre en perfs c'est d'utiliser une Hashtable.

    En cle tu as la classe primitive et en valeur tu as la Classe du wrapper et tu utilises le constructeur acceptant une String.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Je ne sais pas si tu as lu ma solution ou pas..

    Essayes ca pour ton entier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (Integer.TYPE.equals(params[i]))
    {
      os[i] = new Integer(args[i]);
    }
    Il est possible de se choper une exception a toi de la catcher ou tu veux, mais ca devrait marcher.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

Discussions similaires

  1. [Débutant] Génériques et types primitifs
    Par Djakisback dans le forum Langage
    Réponses: 16
    Dernier message: 25/05/2006, 11h03
  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