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 :

Généricité et réflexion en Java ?


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut Généricité et réflexion en Java ?
    Bonjour,

    je voudrais savoir comment avoir le type d'une instance (en runtime) d'une class générique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MaClass<Type> {
    
    public void test(){
    Class clazz = getClassType();
    }
    
    }
    qui peut me fournir le code de getClassType ?

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClass<String> maClass = new MaClass<String>();
     
    maClass.getClassType(); => comment avoir le type String !

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Je pense pas que cela soit possible. (si j'ai bien compris la demande).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    ça confirme ce que je pensais : générique en java c'est uniquement au niveau compilation mais impossible d'y accéder en runtime !

    Merci pour ta réponse wax78.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monobjetamoi.getClass().getSimpleName()
    Tout simplement.
    Mais je m'empresse d'ajouter que si tu comptes faire des cas en fonction de la classe retournée, c'est probablement que la conception est mal faite.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    Merci Flodelarab pour ta réponse. Non je ne compte pas faire des cas en fonction de la classe !

    En fait, j'ai créé une classe générique de persistence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class PersistenceService<T> {
    ...
    public T getOne(Object id, Class<T> classe) {
    		EntityManager em = emf.createEntityManager();
    		T t = em.find(classe, id);
    		return t;
    	}
    }
    et je voudrais éliminer le paramètre classe de getOne(); puisque qu'on sait que la classe sera forcement égale à MonType quand on fait :
    PersistenceService<MonType > psMonType;

    pas la peine de refaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    psMonType.getOne(1,MonType .class);
    je voudrais simplement faire :

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Rien ne t'empêche de le mettre en paramètre du constructeur une bonne fois pour toutes, au lieu d'en paramètre d'une méthode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    Merci theIvin pour la réponse,

    le fait de passer le type en paramètre du constructeur ou en param de la méthode me fera perdre la puissance de génericité ! car il faudera créer par la suite autant d'instance de mon service que de type correspondant.

    ce que je veux savoir c'est est ce qu'il est possible en java de connaître <MonType> en runtime ?

    et apparemment non ! car générique en java est utilisé uniquement par le compilateur et l'information n'est pas transmise au bytecode et donc impossible d'y accéder en runtime.

    vous confirmez ?

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Non mais stop. L'objet qui va réaliser la persistance va s'appliquer sur tes objets. Il n'est pas constitutif des objets. Tu le di toi-même ( ! ) :
    car il faudera créer par la suite autant d'instance de mon service que de type correspondant.
    Tu vas créer des objets qui seront passés à ton service de persistance (Ils sont tous au minimum des Object, pas de types natifs), et tu auras (d'après ce que je comprends) la joie de faire de l'introspection

    lien vers un tuto d'introspection java

    ok?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par need2learn Voir le message
    le fait de passer le type en paramètre du constructeur ou en param de la méthode me fera perdre la puissance de génericité ! car il faudera créer par la suite autant d'instance de mon service que de type correspondant.
    Mais, la classe de ton service est paramétrée par <T>. Du coup tu es bien obligé de créer un service par type correspondant.
    Si c'était la méthode, qui était paramétrée par <T>, et non pas la classe du service, je comprendrais ce que tu veux dire... Mais dans ce cas-là il n'y aurait aucun moyen de deviner ce que vaut <T>, donc le passage d'une Class<T> en paramètre de la méthode, deviendrait indispensable.

    Citation Envoyé par need2learn Voir le message
    ce que je veux savoir c'est est ce qu'il est possible en java de connaître <MonType> en runtime ?
    Non, ou du moins pas aussi simplement. Mais il y a des trucs. Par exemple en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    interface PersistenceService<T> {
      T getOne(Object id);
    }
     
    public class StringPersistenceService implements PersistenceService<String> {
      String getOne(Object id) {
        // TODO
      }
    }
    Comme StringPersistenceService est une classe qui fixe la valeur du paramètre T de l'interface qu'elle implémente, elle connaît ce type au runtime, et il est accessible à travers l'introspection.
    quelque chose comme ((ParameterizedType)getClass().getGenericInterfaces(0)).getActualTypeArguments(0)
    Citation Envoyé par need2learn Voir le message
    et apparemment non ! car générique en java est utilisé uniquement par le compilateur et l'information n'est pas transmise au bytecode et donc impossible d'y accéder en runtime.

    vous confirmez ?
    On confirme. Encore que le bytecode n'a rien à voir là-dedans. Même si les génériques étaient gardés au runtime, le bytecode ne ferait que savoir qu'il traite un type générique. Et il le sait déjà avec Java tel que.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Par défaut
    Merci thelvin pour ta réponse.

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

Discussions similaires

  1. Généricité en Java (classe avec paramètre)
    Par epcilone059 dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2009, 12h05
  2. Généricité en java
    Par NewbiZ dans le forum Général Java
    Réponses: 6
    Dernier message: 11/02/2009, 12h27
  3. Java généricité sans Object
    Par filescan dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 16/07/2008, 11h21
  4. Réponses: 3
    Dernier message: 02/06/2008, 16h43
  5. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34

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