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

Langage Java Discussion :

Récupérer dynamiquement la classe d'un type


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut Récupérer dynamiquement la classe d'un type
    Bonjour,

    Voici la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static <I> I createClient(I mBean) throws Exception
    {
      Class<I> classe = (Class<I>) I.class;
    
    ...
    }
    Pourquoi pour I.class le compilateur indique le message ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Illegal class literal for the type parameter I
    Merci.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Non ce n'est pas possible, car dans l'état actuelle les types Generics sont perdu lors de l'exécution.

    La solution consiste à utiliser un paramètre Class<I> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static <I> I createClient(Class<I> classe, I mBean) throws Exception
    {
        // ...
    }
    Plus d'info sur ce billet blog : Les Generics ne sont pas des Templates comme les autres !

    a++

  3. #3
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Non ce n'est pas possible, car dans l'état actuelle les types Generics sont perdu lors de l'exécution.

    La solution consiste à utiliser un paramètre Class<I> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static <I> I createClient(Class<I> classe, I mBean) throws Exception
    {
        // ...
    }
    Plus d'info sur ce billet blog : Les Generics ne sont pas des Templates comme les autres !

    a++
    C'est exactement ce que je faisais, mais je désirais éviter le deuxième paramètre.

    Merci.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mister Nono Voir le message
    Bonjour,

    Voici la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static <I> I createClient(I mBean) throws Exception
    {
      Class<I> classe = (Class<I>) I.class;
    
    ...
    }
    Pourquoi pour I.class le compilateur indique le message ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Illegal class literal for the type parameter I
    Merci.
    Tu cherches à faire quoi au juste ?
    (l'approche ressemble à un truc que je fais pour les EJBLocator)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu cherches à faire quoi au juste ?
    (l'approche ressemble à un truc que je fais pour les EJBLocator)
    Et bien je cherche à réaliser une lib qui permet de ce connecter automatiquement à un MBean (JMX). Bien sûr moins il y a de paramètres à passer à cette lib, et mieux c'est.

    Donc j'essayais de supprimer le paramètre de cette méthode noté en gras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static <I> I getProxy( I mBean, Class<I> classe) throws Exception
    {
    ...
    }
    A+

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas passer par une interface ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Pourquoi ne pas passer par une interface ?
    Je ne comprends pas ton idée.

    Peux-tu me donner plus de précision ?

    Merci.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je voulais dire (mais ce n'est peut-être pas possible dans ton cas) qu'en passant par une interface (donc un contrat), le type réel de la classe "mBean" n'est plus important, on l'attaque par l'interface.
    Maintenant, si dans ton cas, on ne peut pas factorisé à un contrat particulier, ça n'ira pas.
    Un exemple :
    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
     
    public interface MonContratDeBase
    {
       public void faireCeci(...);
       public Type recuperCela();
       etc...
    }
    public class MaClasseBean1 implements MonContratDeBase
    {
    ...
       public void faireCeci()
       {
          ... traitement specifique à cette classe
       }
       public Type recupereCela()
       {
          ... traitement specifique à cette classe
       }
    }
    public class MaClasseBean2 implements MonContratDeBase
    {
    ...
       public void faireCeci()
       {
          ... traitement specifique à cette classe
       }
       public Type recupereCela()
       {
          ... traitement specifique à cette classe
        }
    }
     
    public class MaClassDeTraitement
    {
       public static MonContratDeBase createUneClasse(String nom)
       {
          return Class.forName(nom).newInstance();
       }
    }
    Tu vois ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Récupérer la classe d'un type générique
    Par Asterius dans le forum Langage
    Réponses: 7
    Dernier message: 21/11/2008, 08h45
  2. est il possible de créer dynamiquement une class ???
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 12/07/2005, 16h22
  3. [Classpath][Classloader]Chargement dynamique de classes
    Par vberetti dans le forum Général Java
    Réponses: 9
    Dernier message: 08/07/2005, 12h11
  4. [MFC] Créer dynamiquement une classe
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/2004, 13h23
  5. [tomcat]chargement dynamique de classes depuis une webapp
    Par alphamax dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/03/2004, 09h59

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